summaryrefslogtreecommitdiff
path: root/storage/myisam
diff options
context:
space:
mode:
authorunknown <istruewing@stella.local>2008-02-06 21:26:05 +0100
committerunknown <istruewing@stella.local>2008-02-06 21:26:05 +0100
commitf134b62c563a7ea57694672254ff9948ec368586 (patch)
tree88af1d4bc9779c63819ace88d5823801766eaf45 /storage/myisam
parent629b355b4a2bc051e538244410edc1e3d0933a65 (diff)
downloadmariadb-git-f134b62c563a7ea57694672254ff9948ec368586.tar.gz
Bug#31331 - MyISAM or Merge Table upgrade incompatibility with 5.1
A table with BLOB/TEXT prefix key part, created with version 4.1, could not be opened by a 5.1 server. The routine check at table open, if the frm file matches the MyISAM table, was too picky regarding old and new implementation of such keys. Added relaxed check for blob prefix key part. No test case. It requires to create a table in 4.1 and open it in 5.1. storage/myisam/ha_myisam.cc: Bug#31331 - MyISAM or Merge Table upgrade incompatibility with 5.1 Added relaxed check for blob prefix key part.
Diffstat (limited to 'storage/myisam')
-rw-r--r--storage/myisam/ha_myisam.cc21
1 files changed, 20 insertions, 1 deletions
diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc
index dfb36700288..4486d317ae0 100644
--- a/storage/myisam/ha_myisam.cc
+++ b/storage/myisam/ha_myisam.cc
@@ -397,7 +397,26 @@ int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo,
}
for (j= t1_keyinfo[i].keysegs; j--;)
{
- if (t1_keysegs[j].type != t2_keysegs[j].type ||
+ uint8 t1_keysegs_j__type= t1_keysegs[j].type;
+
+ /*
+ Table migration from 4.1 to 5.1. In 5.1 a *TEXT key part is
+ always HA_KEYTYPE_VARTEXT2. In 4.1 we had only the equivalent of
+ HA_KEYTYPE_VARTEXT1. Since we treat both the same on MyISAM
+ level, we can ignore a mismatch between these types.
+ */
+ if ((t1_keysegs[j].flag & HA_BLOB_PART) &&
+ (t2_keysegs[j].flag & HA_BLOB_PART))
+ {
+ if ((t1_keysegs_j__type == HA_KEYTYPE_VARTEXT2) &&
+ (t2_keysegs[j].type == HA_KEYTYPE_VARTEXT1))
+ t1_keysegs_j__type= HA_KEYTYPE_VARTEXT1;
+ else if ((t1_keysegs_j__type == HA_KEYTYPE_VARBINARY2) &&
+ (t2_keysegs[j].type == HA_KEYTYPE_VARBINARY1))
+ t1_keysegs_j__type= HA_KEYTYPE_VARBINARY1;
+ }
+
+ if (t1_keysegs_j__type != t2_keysegs[j].type ||
t1_keysegs[j].language != t2_keysegs[j].language ||
t1_keysegs[j].null_bit != t2_keysegs[j].null_bit ||
t1_keysegs[j].length != t2_keysegs[j].length)