Commit f9b33d22 authored by Narayanan V's avatar Narayanan V

merging with mysql-5.1-bugteam tree

parents 9b1076b4 998697fd
...@@ -315,6 +315,7 @@ int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out, ...@@ -315,6 +315,7 @@ int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out,
t2_keys in Number of keys in second table t2_keys in Number of keys in second table
t2_recs in Number of records in second table t2_recs in Number of records in second table
strict in Strict check switch strict in Strict check switch
table in handle to the table object
DESCRIPTION DESCRIPTION
This function compares two MyISAM definitions. By intention it was done This function compares two MyISAM definitions. By intention it was done
...@@ -330,6 +331,10 @@ int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out, ...@@ -330,6 +331,10 @@ int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out,
Otherwise 'strict' flag must be set to 1 and it is not required to pass Otherwise 'strict' flag must be set to 1 and it is not required to pass
converted dot-frm definition as t1_*. converted dot-frm definition as t1_*.
For compatibility reasons we relax some checks, specifically:
- 4.0 (and earlier versions) always set key_alg to 0.
- 4.0 (and earlier versions) have the same language for all keysegs.
RETURN VALUE RETURN VALUE
0 - Equal definitions. 0 - Equal definitions.
1 - Different definitions. 1 - Different definitions.
...@@ -344,10 +349,11 @@ int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out, ...@@ -344,10 +349,11 @@ int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out,
int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo, int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo,
uint t1_keys, uint t1_recs, uint t1_keys, uint t1_recs,
MI_KEYDEF *t2_keyinfo, MI_COLUMNDEF *t2_recinfo, MI_KEYDEF *t2_keyinfo, MI_COLUMNDEF *t2_recinfo,
uint t2_keys, uint t2_recs, bool strict) uint t2_keys, uint t2_recs, bool strict, TABLE *table_arg)
{ {
uint i, j; uint i, j;
DBUG_ENTER("check_definition"); DBUG_ENTER("check_definition");
my_bool mysql_40_compat= table_arg && table_arg->s->frm_version < FRM_VER_TRUE_VARCHAR;
if ((strict ? t1_keys != t2_keys : t1_keys > t2_keys)) if ((strict ? t1_keys != t2_keys : t1_keys > t2_keys))
{ {
DBUG_PRINT("error", ("Number of keys differs: t1_keys=%u, t2_keys=%u", DBUG_PRINT("error", ("Number of keys differs: t1_keys=%u, t2_keys=%u",
...@@ -386,8 +392,9 @@ int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo, ...@@ -386,8 +392,9 @@ int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo,
test(t2_keyinfo[i].flag & HA_SPATIAL))); test(t2_keyinfo[i].flag & HA_SPATIAL)));
DBUG_RETURN(1); DBUG_RETURN(1);
} }
if (t1_keyinfo[i].keysegs != t2_keyinfo[i].keysegs || if ((mysql_40_compat &&
t1_keyinfo[i].key_alg != t2_keyinfo[i].key_alg) t1_keyinfo[i].key_alg != t2_keyinfo[i].key_alg) ||
t1_keyinfo[i].keysegs != t2_keyinfo[i].keysegs)
{ {
DBUG_PRINT("error", ("Key %d has different definition", i)); DBUG_PRINT("error", ("Key %d has different definition", i));
DBUG_PRINT("error", ("t1_keysegs=%d, t1_key_alg=%d", DBUG_PRINT("error", ("t1_keysegs=%d, t1_key_alg=%d",
...@@ -417,8 +424,9 @@ int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo, ...@@ -417,8 +424,9 @@ int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo,
t1_keysegs_j__type= HA_KEYTYPE_VARBINARY1; /* purecov: inspected */ t1_keysegs_j__type= HA_KEYTYPE_VARBINARY1; /* purecov: inspected */
} }
if (t1_keysegs_j__type != t2_keysegs[j].type || if ((mysql_40_compat &&
t1_keysegs[j].language != t2_keysegs[j].language || t1_keysegs[j].language != t2_keysegs[j].language) ||
t1_keysegs_j__type != t2_keysegs[j].type ||
t1_keysegs[j].null_bit != t2_keysegs[j].null_bit || t1_keysegs[j].null_bit != t2_keysegs[j].null_bit ||
t1_keysegs[j].length != t2_keysegs[j].length) t1_keysegs[j].length != t2_keysegs[j].length)
{ {
...@@ -671,7 +679,8 @@ int ha_myisam::open(const char *name, int mode, uint test_if_locked) ...@@ -671,7 +679,8 @@ int ha_myisam::open(const char *name, int mode, uint test_if_locked)
} }
if (check_definition(keyinfo, recinfo, table->s->keys, recs, if (check_definition(keyinfo, recinfo, table->s->keys, recs,
file->s->keyinfo, file->s->rec, file->s->keyinfo, file->s->rec,
file->s->base.keys, file->s->base.fields, true)) file->s->base.keys, file->s->base.fields,
true, table))
{ {
/* purecov: begin inspected */ /* purecov: begin inspected */
my_errno= HA_ERR_CRASHED; my_errno= HA_ERR_CRASHED;
......
...@@ -137,7 +137,8 @@ extern int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out, ...@@ -137,7 +137,8 @@ extern int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out,
extern int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo, extern int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo,
uint t1_keys, uint t1_recs, uint t1_keys, uint t1_recs,
MI_KEYDEF *t2_keyinfo, MI_COLUMNDEF *t2_recinfo, MI_KEYDEF *t2_keyinfo, MI_COLUMNDEF *t2_recinfo,
uint t2_keys, uint t2_recs, bool strict); uint t2_keys, uint t2_recs, bool strict,
TABLE *table_arg);
static void split_file_name(const char *file_name, static void split_file_name(const char *file_name,
LEX_STRING *db, LEX_STRING *name); LEX_STRING *db, LEX_STRING *name);
...@@ -595,7 +596,7 @@ int ha_myisammrg::attach_children(void) ...@@ -595,7 +596,7 @@ int ha_myisammrg::attach_children(void)
if (check_definition(keyinfo, recinfo, keys, recs, if (check_definition(keyinfo, recinfo, keys, recs,
u_table->table->s->keyinfo, u_table->table->s->rec, u_table->table->s->keyinfo, u_table->table->s->rec,
u_table->table->s->base.keys, u_table->table->s->base.keys,
u_table->table->s->base.fields, false)) u_table->table->s->base.fields, false, NULL))
{ {
DBUG_PRINT("error", ("table definition mismatch: '%s'", DBUG_PRINT("error", ("table definition mismatch: '%s'",
u_table->table->filename)); u_table->table->filename));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment