summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <tnurnberg@mysql.com/sin.azundris.com>2007-02-12 14:39:45 +0100
committerunknown <tnurnberg@mysql.com/sin.azundris.com>2007-02-12 14:39:45 +0100
commit8a34c4bb78ca1afe57819c8be276446f01087f11 (patch)
treec369de40791c96d676de660f9a7c304bb2940d8a /sql
parent43ada21fe1961da0b0c6a0fcfe2040b13acd1320 (diff)
parent4dc7c1aa46c4980833dd0f20bdc0650d9bd669c0 (diff)
downloadmariadb-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.cc11
-rw-r--r--sql/unireg.cc61
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))