diff options
author | unknown <tnurnberg@mysql.com/sin.azundris.com> | 2007-02-12 14:39:45 +0100 |
---|---|---|
committer | unknown <tnurnberg@mysql.com/sin.azundris.com> | 2007-02-12 14:39:45 +0100 |
commit | 8a34c4bb78ca1afe57819c8be276446f01087f11 (patch) | |
tree | c369de40791c96d676de660f9a7c304bb2940d8a /sql | |
parent | 43ada21fe1961da0b0c6a0fcfe2040b13acd1320 (diff) | |
parent | 4dc7c1aa46c4980833dd0f20bdc0650d9bd669c0 (diff) | |
download | mariadb-git-8a34c4bb78ca1afe57819c8be276446f01087f11.tar.gz |
Merge tnurnberg@bk-internal.mysql.com:/home/bk/mysql-4.1-maint
into mysql.com:/home/tnurnberg/24660/41-24660
sql/table.cc:
Auto merged
Diffstat (limited to 'sql')
-rw-r--r-- | sql/table.cc | 11 | ||||
-rw-r--r-- | sql/unireg.cc | 61 |
2 files changed, 40 insertions, 32 deletions
diff --git a/sql/table.cc b/sql/table.cc index dab2f978327..a85da8395e7 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -393,17 +393,6 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, { char *val= (char*) interval->type_names[count]; interval->type_lengths[count]= strlen(val); - /* - Replace all ',' symbols with NAMES_SEP_CHAR. - See the comment in unireg.cc, pack_fields() function - for details. - */ - for (uint cnt= 0 ; cnt < interval->type_lengths[count] ; cnt++) - { - char c= val[cnt]; - if (c == ',') - val[cnt]= NAMES_SEP_CHAR; - } } interval->type_lengths[count]= 0; } diff --git a/sql/unireg.cc b/sql/unireg.cc index 4e1a68ae90f..e5ee0222f20 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -657,29 +657,48 @@ static bool pack_fields(File file, List<create_field> &create_fields, { if (field->interval_id > int_count) { - int_count=field->interval_id; - tmp.append(NAMES_SEP_CHAR); - for (const char **pos=field->interval->type_names ; *pos ; pos++) - { - char *val= (char*) *pos; - uint str_len= strlen(val); - /* - Note, hack: in old frm NAMES_SEP_CHAR is used to separate - names in the interval (ENUM/SET). To allow names to contain - NAMES_SEP_CHAR, we replace it with a comma before writing frm. - Backward conversion is done during frm file opening, - See table.cc, openfrm() function - */ - for (uint cnt= 0 ; cnt < str_len ; cnt++) + unsigned char sep= 0; + unsigned char occ[256]; + uint i; + unsigned char *val= NULL; + + bzero(occ, sizeof(occ)); + + for (i=0; (val= (unsigned char*) field->interval->type_names[i]); i++) + for (uint j = 0; j < field->interval->type_lengths[i]; j++) + occ[(unsigned int) (val[j])]= 1; + + if (!occ[(unsigned char)NAMES_SEP_CHAR]) + sep= (unsigned char) NAMES_SEP_CHAR; + else if (!occ[(unsigned int)',']) + sep= ','; + else + { + for (uint i=1; i<256; i++) + { + if(!occ[i]) + { + sep= i; + break; + } + } + + if(!sep) /* disaster, enum uses all characters, none left as separator */ { - char c= val[cnt]; - if (c == NAMES_SEP_CHAR) - val[cnt]= ','; + my_message(ER_WRONG_FIELD_TERMINATORS,ER(ER_WRONG_FIELD_TERMINATORS), + MYF(0)); + DBUG_RETURN(1); } - tmp.append(*pos); - tmp.append(NAMES_SEP_CHAR); - } - tmp.append('\0'); // End of intervall + } + + int_count= field->interval_id; + tmp.append(sep); + for (const char **pos=field->interval->type_names ; *pos ; pos++) + { + tmp.append(*pos); + tmp.append(sep); + } + tmp.append('\0'); // End of intervall } } if (my_write(file,(byte*) tmp.ptr(),tmp.length(),MYF_RW)) |