Commit 564c447b authored by monty@mashka.mysql.fi's avatar monty@mashka.mysql.fi

Allow 4.0 to read new 4.1 .frm files

parent cf9668fd
...@@ -83,4 +83,3 @@ tags: ...@@ -83,4 +83,3 @@ tags:
test: test:
cd mysql-test ; ./mysql-test-run cd mysql-test ; ./mysql-test-run
...@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script. ...@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
AC_INIT(sql/mysqld.cc) AC_INIT(sql/mysqld.cc)
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line! # The Docs Makefile.am parses this line!
AM_INIT_AUTOMAKE(mysql, 4.0.11) AM_INIT_AUTOMAKE(mysql, 4.0.11-gamma)
AM_CONFIG_HEADER(config.h) AM_CONFIG_HEADER(config.h)
PROTOCOL_VERSION=10 PROTOCOL_VERSION=10
...@@ -702,7 +702,7 @@ AC_ARG_WITH(mysqld-user, ...@@ -702,7 +702,7 @@ AC_ARG_WITH(mysqld-user,
AC_SUBST(MYSQLD_USER) AC_SUBST(MYSQLD_USER)
# If we should allow LOAD DATA LOCAL # If we should allow LOAD DATA LOCAL
AC_MSG_CHECKING(if we should should enable LOAD DATA LOCAL by default) AC_MSG_CHECKING(If we should should enable LOAD DATA LOCAL by default)
AC_ARG_ENABLE(local-infile, AC_ARG_ENABLE(local-infile,
[ --enable-local-infile Enable LOAD DATA LOCAL INFILE (default: disabled)], [ --enable-local-infile Enable LOAD DATA LOCAL INFILE (default: disabled)],
[ ENABLED_LOCAL_INFILE=$enableval ], [ ENABLED_LOCAL_INFILE=$enableval ],
......
...@@ -95,11 +95,11 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, ...@@ -95,11 +95,11 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
if (my_read(file,(byte*) head,64,MYF(MY_NABP))) goto err_not_open; if (my_read(file,(byte*) head,64,MYF(MY_NABP))) goto err_not_open;
if (head[0] != (uchar) 254 || head[1] != 1 || if (head[0] != (uchar) 254 || head[1] != 1 ||
(head[2] != FRM_VER && head[2] > FRM_VER+2)) (head[2] != FRM_VER && head[2] != FRM_VER+1 && head[2] != FRM_VER+3))
goto err_not_open; /* purecov: inspected */ goto err_not_open; /* purecov: inspected */
new_field_pack_flag=head[27]; new_field_pack_flag=head[27];
new_frm_ver= (head[2] - FRM_VER); new_frm_ver= (head[2] - FRM_VER);
field_pack_length= new_frm_ver < 2 ? 11 : 15; field_pack_length= new_frm_ver < 2 ? 11 : 17;
error=3; error=3;
if (!(pos=get_form_pos(file,head,(TYPELIB*) 0))) if (!(pos=get_form_pos(file,head,(TYPELIB*) 0)))
...@@ -154,7 +154,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, ...@@ -154,7 +154,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
for (i=0 ; i < keys ; i++, keyinfo++) for (i=0 ; i < keys ; i++, keyinfo++)
{ {
if (new_frm_ver == 2) if (new_frm_ver == 3)
{ {
keyinfo->flags= (uint) uint2korr(strpos) ^ HA_NOSAME; keyinfo->flags= (uint) uint2korr(strpos) ^ HA_NOSAME;
keyinfo->key_length= (uint) uint2korr(strpos+2); keyinfo->key_length= (uint) uint2korr(strpos+2);
...@@ -343,28 +343,37 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, ...@@ -343,28 +343,37 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
for (i=0 ; i < outparam->fields; i++, strpos+=field_pack_length, field_ptr++) for (i=0 ; i < outparam->fields; i++, strpos+=field_pack_length, field_ptr++)
{ {
uint pack_flag= uint2korr(strpos+6); uint pack_flag, interval_nr, unireg_type, recpos, field_length;
uint interval_nr= (uint) strpos[10];
enum_field_types field_type; enum_field_types field_type;
if (new_frm_ver == 2) if (new_frm_ver == 3)
{ {
/* new frm file in 4.1 */ /* new frm file in 4.1 */
field_type=(enum_field_types) (uint) strpos[11]; field_length= uint2korr(strpos+3);
recpos= uint3korr(strpos+5);
pack_flag= uint2korr(strpos+8);
unireg_type= (uint) strpos[10];
interval_nr= (uint) strpos[12];
field_type= (enum_field_types) (uint) strpos[13];
} }
else else
{ {
/* old frm file */ /* old frm file */
field_length= (uint) strpos[3];
recpos= uint2korr(strpos+4),
pack_flag= uint2korr(strpos+6);
unireg_type= (uint) strpos[8];
interval_nr= (uint) strpos[10];
field_type= (enum_field_types) f_packtype(pack_flag); field_type= (enum_field_types) f_packtype(pack_flag);
} }
*field_ptr=reg_field= *field_ptr=reg_field=
make_field(record+uint2korr(strpos+4), make_field(record+recpos,
(uint32) strpos[3], // field_length (uint32) field_length,
null_pos,null_bit, null_pos,null_bit,
pack_flag, pack_flag,
field_type, field_type,
(Field::utype) MTYP_TYPENR((uint) strpos[8]), (Field::utype) MTYP_TYPENR(unireg_type),
(interval_nr ? (interval_nr ?
outparam->intervals+interval_nr-1 : outparam->intervals+interval_nr-1 :
(TYPELIB*) 0), (TYPELIB*) 0),
...@@ -1215,7 +1224,7 @@ db_type get_table_type(const char *name) ...@@ -1215,7 +1224,7 @@ db_type get_table_type(const char *name)
error=my_read(file,(byte*) head,4,MYF(MY_NABP)); error=my_read(file,(byte*) head,4,MYF(MY_NABP));
my_close(file,MYF(0)); my_close(file,MYF(0));
if (error || head[0] != (uchar) 254 || head[1] != 1 || if (error || head[0] != (uchar) 254 || head[1] != 1 ||
(head[2] != FRM_VER && head[2] != FRM_VER+1)) (head[2] != FRM_VER && head[2] != FRM_VER+1 && head[2] != FRM_VER+3))
DBUG_RETURN(DB_TYPE_UNKNOWN); DBUG_RETURN(DB_TYPE_UNKNOWN);
DBUG_RETURN(ha_checktype((enum db_type) (uint) *(head+3))); DBUG_RETURN(ha_checktype((enum db_type) (uint) *(head+3)));
} }
......
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