From a99cb51c9d93d34eedbc08a9fca793855e3b9e05 Mon Sep 17 00:00:00 2001
From: unknown <monty@mysql.com>
Date: Tue, 22 Mar 2005 15:48:06 +0200
Subject: [PATCH] Hack to ensure that CHAR's created in 5.0 are not converted
 to VARCHAR even if the row type is dynamic (For 4.1 tables old 'VARCHAR'
 fields are converted to true VARCHAR in the next ALTER TABLE)

This ensures that one can use MySQL 5.0 privilege tables with MySQL 4.1


mysql-test/r/information_schema.result:
  Update results (for .frm version number change)
mysql-test/r/ndb_autodiscover.result:
  Update results (for .frm version number change)
mysql-test/r/ps_1general.result:
  Update results (for .frm version number change)
mysql-test/r/show_check.result:
  Update results (for .frm version number change)
mysql-test/r/view.result:
  Update results (for .frm version number change)
scripts/fill_func_tables.sh:
  Ensure that no privilege tables that is used in 4.1 uses VARCHAR
scripts/mysql_create_system_tables.sh:
  Ensure that no privilege tables that is used in 4.1 uses VARCHAR
scripts/mysql_fix_privilege_tables.sh:
  Fixed bug that made it impossible to run the script from the mysql source dist
scripts/mysql_fix_privilege_tables.sql:
  Ensure that no privilege tables that is used in 4.1 uses VARCHAR
sql/sql_table.cc:
  Only set create_info->varchar if we are using the new VARCHAR field
sql/table.cc:
  Hack to ensure that CHAR's created in 5.0 are not converted to VARCHAR even if the row type is dynamic
  (For 4.1 tables old 'VARCHAR' fields are converted to true VARCHAR in the next ALTER TABLE)
---
 mysql-test/r/information_schema.result |  5 ++-
 mysql-test/r/ndb_autodiscover.result   |  4 +--
 mysql-test/r/ps_1general.result        |  2 +-
 mysql-test/r/show_check.result         | 42 +++++++++++++-------------
 mysql-test/r/view.result               |  4 +--
 scripts/fill_func_tables.sh            |  8 ++---
 scripts/mysql_create_system_tables.sh  | 10 +++---
 scripts/mysql_fix_privilege_tables.sh  |  2 +-
 scripts/mysql_fix_privilege_tables.sql | 42 +++++++++++++++++++++++---
 sql/sql_table.cc                       |  9 ++----
 sql/table.cc                           | 10 ++++++
 11 files changed, 87 insertions(+), 51 deletions(-)

diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result
index dc456e80e6..1c3525c150 100644
--- a/mysql-test/r/information_schema.result
+++ b/mysql-test/r/information_schema.result
@@ -118,8 +118,8 @@ t2
 t3
 show table status;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
-t2	MyISAM	9	Fixed	0	0	0	#	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL		
-t3	MyISAM	9	Fixed	0	0	0	#	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL		
+t2	MyISAM	10	Fixed	0	0	0	#	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL		
+t3	MyISAM	10	Fixed	0	0	0	#	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL		
 v1	NULL	NULL	NULL	NULL	NULL	NULL	#	NULL	NULL	NULL	#	#	NULL	NULL	NULL	NULL	view
 show full columns from t3 like "a%";
 Field	Type	Collation	Null	Key	Default	Extra	Privileges	Comment
@@ -432,7 +432,6 @@ information_schema.tables) union select version from
 information_schema.tables;
 s1
 0
-9
 10
 drop table t1;
 SHOW CREATE TABLE INFORMATION_SCHEMA.character_sets;
diff --git a/mysql-test/r/ndb_autodiscover.result b/mysql-test/r/ndb_autodiscover.result
index 38b34579f0..27ebda3666 100644
--- a/mysql-test/r/ndb_autodiscover.result
+++ b/mysql-test/r/ndb_autodiscover.result
@@ -144,8 +144,8 @@ Handler_discover	1
 flush tables;
 show table status;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
-t6	MyISAM	9	Fixed	1	260	#	#	#	0	NULL	#	#	NULL	#	NULL		#
-t7	ndbcluster	9	Fixed	1	276	#	#	#	0	NULL	#	#	NULL	#	NULL		#
+t6	MyISAM	10	Fixed	1	260	#	#	#	0	NULL	#	#	NULL	#	NULL		#
+t7	ndbcluster	10	Fixed	1	276	#	#	#	0	NULL	#	#	NULL	#	NULL		#
 show status like 'handler_discover%';
 Variable_name	Value
 Handler_discover	2
diff --git a/mysql-test/r/ps_1general.result b/mysql-test/r/ps_1general.result
index cd3c8e162f..342b3e3ef0 100644
--- a/mysql-test/r/ps_1general.result
+++ b/mysql-test/r/ps_1general.result
@@ -290,7 +290,7 @@ t2	1	t2_idx	1	b	A	NULL	NULL	NULL	YES	BTREE
 prepare stmt4 from ' show table status from test like ''t2%'' ';
 execute stmt4;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
-t2	MyISAM	9	Fixed	0	0	0	64424509439	1024	0	NULL	#	#	#	latin1_swedish_ci	NULL		
+t2	MyISAM	10	Fixed	0	0	0	64424509439	1024	0	NULL	#	#	#	latin1_swedish_ci	NULL		
 prepare stmt4 from ' show table status from test like ''t9%'' ';
 execute stmt4;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result
index 15cae7646f..7c34481b51 100644
--- a/mysql-test/r/show_check.result
+++ b/mysql-test/r/show_check.result
@@ -315,57 +315,57 @@ insert into t2 values (1),(2);
 insert into t3 values (1,1),(2,2);
 show table status;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
-t1	MEMORY	9	Fixed	2	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t2	MEMORY	9	Fixed	2	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t3	MEMORY	9	Fixed	2	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t1	MEMORY	10	Fixed	2	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t2	MEMORY	10	Fixed	2	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t3	MEMORY	10	Fixed	2	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
 insert into t1 values (3),(4);
 insert into t2 values (3),(4);
 insert into t3 values (3,3),(4,4);
 show table status;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
-t1	MEMORY	9	Fixed	4	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t2	MEMORY	9	Fixed	4	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t3	MEMORY	9	Fixed	4	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t1	MEMORY	10	Fixed	4	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t2	MEMORY	10	Fixed	4	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t3	MEMORY	10	Fixed	4	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
 insert into t1 values (5);
 insert into t2 values (5);
 insert into t3 values (5,5);
 show table status;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
-t1	MEMORY	9	Fixed	5	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t2	MEMORY	9	Fixed	5	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t3	MEMORY	9	Fixed	5	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t1	MEMORY	10	Fixed	5	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t2	MEMORY	10	Fixed	5	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t3	MEMORY	10	Fixed	5	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
 delete from t1 where a=3;
 delete from t2 where b=3;
 delete from t3 where a=3;
 show table status;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
-t1	MEMORY	9	Fixed	4	#	#	#	#	#	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t2	MEMORY	9	Fixed	4	#	#	#	#	#	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t3	MEMORY	9	Fixed	4	#	#	#	#	#	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t1	MEMORY	10	Fixed	4	#	#	#	#	#	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t2	MEMORY	10	Fixed	4	#	#	#	#	#	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t3	MEMORY	10	Fixed	4	#	#	#	#	#	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
 delete from t1;
 delete from t2;
 delete from t3;
 show table status;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
-t1	MEMORY	9	Fixed	0	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t2	MEMORY	9	Fixed	0	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t3	MEMORY	9	Fixed	0	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t1	MEMORY	10	Fixed	0	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t2	MEMORY	10	Fixed	0	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t3	MEMORY	10	Fixed	0	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
 insert into t1 values (5);
 insert into t2 values (5);
 insert into t3 values (5,5);
 show table status;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
-t1	MEMORY	9	Fixed	1	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t2	MEMORY	9	Fixed	1	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t3	MEMORY	9	Fixed	1	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t1	MEMORY	10	Fixed	1	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t2	MEMORY	10	Fixed	1	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t3	MEMORY	10	Fixed	1	#	#	#	#	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
 delete from t1 where a=5;
 delete from t2 where b=5;
 delete from t3 where a=5;
 show table status;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
-t1	MEMORY	9	Fixed	0	#	#	#	#	#	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t2	MEMORY	9	Fixed	0	#	#	#	#	#	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
-t3	MEMORY	9	Fixed	0	#	#	#	#	#	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t1	MEMORY	10	Fixed	0	#	#	#	#	#	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t2	MEMORY	10	Fixed	0	#	#	#	#	#	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
+t3	MEMORY	10	Fixed	0	#	#	#	#	#	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
 drop table t1, t2, t3;
 create database mysqltest;
 show create database mysqltest;
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index 75459bd960..ae1bb42cc2 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -149,7 +149,7 @@ v5	VIEW
 v6	VIEW
 show table status;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
-t1	MyISAM	9	Fixed	5	9	45	38654705663	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL		
+t1	MyISAM	10	Fixed	5	9	45	38654705663	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL		
 v1	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	#	#	NULL	NULL	NULL	NULL	view
 v2	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	#	#	NULL	NULL	NULL	NULL	view
 v3	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	#	#	NULL	NULL	NULL	NULL	view
@@ -1115,7 +1115,7 @@ select * from v1;
 ERROR HY000: View 'test.v1' references invalid table(s) or column(s) or function(s)
 show table status;
 Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
-t1	MyISAM	9	Fixed	0	0	0	#	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL		
+t1	MyISAM	10	Fixed	0	0	0	#	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL		
 v1	NULL	NULL	NULL	NULL	NULL	NULL	#	NULL	NULL	NULL	#	#	NULL	NULL	NULL	NULL	View 'test.v1' references invalid table(s) or column(s) or function(s)
 drop view v1;
 drop table t1;
diff --git a/scripts/fill_func_tables.sh b/scripts/fill_func_tables.sh
index 459afee2fe..203c730dd9 100644
--- a/scripts/fill_func_tables.sh
+++ b/scripts/fill_func_tables.sh
@@ -131,8 +131,8 @@ print "USE mysql_help;\n";
 print "DROP TABLE IF EXISTS function;\n";
 print "CREATE TABLE function (";
 print "  func_id       int unsigned not null auto_increment,";
-print "  name          varchar(64) not null,";
-print "  url           varchar(128) not null,";
+print "  name          char(64) not null,";
+print "  url           char(128) not null,";
 print "  description   text not null,";
 print "  example       text not null,";
 print "  min_args      tinyint not null,";
@@ -145,8 +145,8 @@ print ") type=myisam;\n\n";
 print "DROP TABLE IF EXISTS function_category_name;\n";
 print "CREATE TABLE function_category_name (";
 print "  cat_id        smallint unsigned not null auto_increment,";
-print "  name          varchar(64) not null,";
-print "  url           varchar(128) not null,";
+print "  name          char(64) not null,";
+print "  url           char(128) not null,";
 print "  date_created  datetime not null,";
 print "  last_modified timestamp not null,";
 print "  primary key   (cat_id)";
diff --git a/scripts/mysql_create_system_tables.sh b/scripts/mysql_create_system_tables.sh
index d87113d365..0260bdea88 100644
--- a/scripts/mysql_create_system_tables.sh
+++ b/scripts/mysql_create_system_tables.sh
@@ -269,11 +269,11 @@ then
 
   c_ht="$c_ht CREATE TABLE help_topic ("
   c_ht="$c_ht   help_topic_id    int unsigned not null,"
-  c_ht="$c_ht   name             varchar(64) not null,"
+  c_ht="$c_ht   name             char(64) not null,"
   c_ht="$c_ht   help_category_id smallint unsigned not null,"
   c_ht="$c_ht   description      text not null,"
   c_ht="$c_ht   example          text not null,"
-  c_ht="$c_ht   url              varchar(128) not null,"
+  c_ht="$c_ht   url              char(128) not null,"
   c_ht="$c_ht   primary key      (help_topic_id),"
   c_ht="$c_ht   unique index     (name)"
   c_ht="$c_ht ) engine=MyISAM"
@@ -291,9 +291,9 @@ then
   
   c_hc="$c_hc CREATE TABLE help_category ("
   c_hc="$c_hc   help_category_id   smallint unsigned not null,"
-  c_hc="$c_hc   name               varchar(64) not null,"
+  c_hc="$c_hc   name               char(64) not null,"
   c_hc="$c_hc   parent_category_id smallint unsigned null,"
-  c_hc="$c_hc   url                varchar(128) not null,"
+  c_hc="$c_hc   url                char(128) not null,"
   c_hc="$c_hc   primary key        (help_category_id),"
   c_hc="$c_hc   unique index       (name)"
   c_hc="$c_hc ) engine=MyISAM"
@@ -309,7 +309,7 @@ then
 
   c_hk="$c_hk CREATE TABLE help_keyword ("
   c_hk="$c_hk   help_keyword_id  int unsigned not null,"
-  c_hk="$c_hk   name             varchar(64) not null,"
+  c_hk="$c_hk   name             char(64) not null,"
   c_hk="$c_hk   primary key      (help_keyword_id),"
   c_hk="$c_hk   unique index     (name)"
   c_hk="$c_hk ) engine=MyISAM"
diff --git a/scripts/mysql_fix_privilege_tables.sh b/scripts/mysql_fix_privilege_tables.sh
index d5c9653278..d080b68b26 100644
--- a/scripts/mysql_fix_privilege_tables.sh
+++ b/scripts/mysql_fix_privilege_tables.sh
@@ -13,7 +13,7 @@ args=""
 port=""
 socket=""
 database="mysql"
-bindir="."
+bindir=""
 pkgdatadir="@pkgdatadir@"
 print_defaults_bindir="."
 
diff --git a/scripts/mysql_fix_privilege_tables.sql b/scripts/mysql_fix_privilege_tables.sql
index 2310e8d0be..344f8ca5bb 100644
--- a/scripts/mysql_fix_privilege_tables.sql
+++ b/scripts/mysql_fix_privilege_tables.sql
@@ -307,19 +307,19 @@ KEY Grantor (Grantor)
 
 CREATE TABLE IF NOT EXISTS help_topic (
 help_topic_id int unsigned not null,
-name varchar(64) not null,
+name char(64) not null,
 help_category_id smallint unsigned not null,
 description text not null,
 example text not null,
-url varchar(128) not null,
+url char(128) not null,
 primary key (help_topic_id), unique index (name)
 ) CHARACTER SET utf8 comment='help topics';
 
 CREATE TABLE IF NOT EXISTS help_category (
 help_category_id smallint unsigned not null,
-name varchar(64) not null,
+name char(64) not null,
 parent_category_id smallint unsigned null,
-url varchar(128) not null,
+url char(128) not null,
 primary key (help_category_id),
 unique index (name)
 ) CHARACTER SET utf8 comment='help categories';
@@ -332,7 +332,7 @@ primary key (help_keyword_id, help_topic_id)
 
 CREATE TABLE IF NOT EXISTS help_keyword (
 help_keyword_id int unsigned not null,
-name varchar(64) not null,
+name char(64) not null,
 primary key (help_keyword_id),
 unique index (name)
 ) CHARACTER SET utf8 comment='help keywords';
@@ -479,3 +479,35 @@ ALTER TABLE proc MODIFY name char(64) DEFAULT '' NOT NULL,
                             'NO_AUTO_CREATE_USER',
                             'HIGH_NOT_PRECEDENCE'
                             ) DEFAULT 0 NOT NULL;
+
+#
+# Change all varchar fields in privilege tables to CHAR, to ensure that
+# we can use the privilege tables in MySQL 4.1
+# Note that for this hack to work, we must change all CHAR() columns at
+# the same time
+#
+
+ALTER TABLE mysql.user
+modify Host char(60) binary DEFAULT '' NOT NULL,
+modify User char(16) binary DEFAULT '' NOT NULL,
+modify Password char(41) binary DEFAULT '' NOT NULL;
+
+ALTER TABLE mysql.db
+modify Host char(60) binary DEFAULT '' NOT NULL,
+modify Db char(64) binary DEFAULT '' NOT NULL,
+modify User char(16) binary DEFAULT '' NOT NULL;
+
+ALTER TABLE mysql.host
+modify Host char(60) binary DEFAULT '' NOT NULL,
+modify Db char(64) binary DEFAULT '' NOT NULL;
+
+ALTER TABLE help_topic
+modify name char(64) not null,
+modify url  char(128) not null;
+
+ALTER TABLE help_category
+modify name char(64) not null,
+modify url char(128) not null;
+
+ALTER TABLE help_keyword
+modify name char(64) not null;
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 82d887891c..b125eeaf03 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -613,7 +613,7 @@ int prepare_create_field(create_field *sql_field,
     Prepares the table and key structures for table creation.
 
   NOTES
-    sets create_info->varchar if the table has a varchar or blob.
+    sets create_info->varchar if the table has a varchar
 
   RETURN VALUES
     0	ok
@@ -862,12 +862,7 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
 			     &timestamps, &timestamps_with_niladic,
 			     file->table_flags()))
       DBUG_RETURN(-1);
-    if (sql_field->sql_type == FIELD_TYPE_BLOB ||
-        sql_field->sql_type == FIELD_TYPE_MEDIUM_BLOB ||
-        sql_field->sql_type == FIELD_TYPE_TINY_BLOB ||
-        sql_field->sql_type == FIELD_TYPE_LONG_BLOB ||
-        sql_field->sql_type == FIELD_TYPE_GEOMETRY ||
-        sql_field->sql_type == MYSQL_TYPE_VARCHAR)
+    if (sql_field->sql_type == MYSQL_TYPE_VARCHAR)
       create_info->varchar= 1;
     sql_field->offset= pos;
     if (MTYP_TYPENR(sql_field->unireg_check) == Field::NEXT_NUMBER)
diff --git a/sql/table.cc b/sql/table.cc
index 939690395d..9238d8aa68 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -149,6 +149,15 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat,
   *fn_ext(index_file)='\0';			// Remove .frm extension
 
   share->frm_version= head[2];
+  /*
+    Check if .frm file created by MySQL 5.0. In this case we want to
+    display CHAR fields as CHAR and not as VARCHAR.
+    We do it this way as we want to keep the old frm version to enable
+    MySQL 4.1 to read these files.
+  */
+  if (share->frm_version == FRM_VER_TRUE_VARCHAR -1 && head[33] == 5)
+    share->frm_version= FRM_VER_TRUE_VARCHAR;
+
   share->db_type= ha_checktype((enum db_type) (uint) *(head+3));
   share->db_create_options= db_create_options=uint2korr(head+30);
   share->db_options_in_use= share->db_create_options;
@@ -1317,6 +1326,7 @@ File create_frm(register my_string name, uint reclength, uchar *fileinfo,
     create_info->table_options|=HA_OPTION_LONG_BLOB_PTR; // Use portable blob pointers
     int2store(fileinfo+30,create_info->table_options);
     fileinfo[32]=0;				// No filename anymore
+    fileinfo[33]=5;                             // Mark for 5.0 frm file
     int4store(fileinfo+34,create_info->avg_row_length);
     fileinfo[38]= (create_info->default_table_charset ?
 		   create_info->default_table_charset->number : 0);
-- 
2.30.9