From 7b652e9a29dbdb883b09c512e1552f492b402f4a Mon Sep 17 00:00:00 2001 From: "ram@gw.mysql.r18.ru" <> Date: Wed, 14 Jan 2004 16:01:55 +0400 Subject: [PATCH] fix for the 2361 bug: ALTER TABLE ... DROP PRIMARY KEY drops a non-primary key "PRIMARY" has been replaced by primary_key_name. --- sql/mysql_priv.h | 1 + sql/sql_help.cc | 4 ++-- sql/sql_select.cc | 8 ++++---- sql/sql_show.cc | 2 +- sql/sql_table.cc | 8 ++++---- sql/table.cc | 4 ++-- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 15a99385285..a277e06301b 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -38,6 +38,7 @@ typedef ulong key_part_map; /* Used for finding key parts */ /* useful constants */ extern const key_map key_map_empty; extern const key_map key_map_full; +extern const char *primary_key_name; #include "mysql_com.h" #include diff --git a/sql/sql_help.cc b/sql/sql_help.cc index c40133c04a8..d5516fe3337 100644 --- a/sql/sql_help.cc +++ b/sql/sql_help.cc @@ -274,9 +274,9 @@ int get_topics_for_keyword(THD *thd, TABLE *topics, TABLE *relations, DBUG_ENTER("get_topics_for_keyword"); - if ((iindex_topic= find_type((char*) "PRIMARY", + if ((iindex_topic= find_type((char*) primary_key_name, &topics->keynames, 1+2)-1)<0 || - (iindex_relations= find_type((char*) "PRIMARY", + (iindex_relations= find_type((char*) primary_key_name, &relations->keynames, 1+2)-1)<0) { send_error(thd,ER_CORRUPT_HELP_DB); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index a1f6abfd53a..1b03a70c43d 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -9130,16 +9130,16 @@ int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result) { res= mysql_explain_select(thd, sl, (((&thd->lex->select_lex)==sl)? - ((thd->lex->all_selects_list != sl)?"PRIMARY": - "SIMPLE"): + ((thd->lex->all_selects_list != sl) ? + primary_key_name : "SIMPLE"): ((sl == first)? ((sl->linkage == DERIVED_TABLE_TYPE) ? "DERIVED": - ((sl->uncacheable & UNCACHEABLE_DEPENDENT)? + ((sl->uncacheable & UNCACHEABLE_DEPENDENT) ? "DEPENDENT SUBQUERY": (sl->uncacheable?"UNCACHEABLE SUBQUERY": "SUBQUERY"))): - ((sl->uncacheable & UNCACHEABLE_DEPENDENT)? + ((sl->uncacheable & UNCACHEABLE_DEPENDENT) ? "DEPENDENT UNION": sl->uncacheable?"UNCACHEABLE UNION": "UNION"))), diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 52f7e6cb9ed..984d57fc354 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1167,7 +1167,7 @@ store_create_info(THD *thd, TABLE *table, String *packet) bool found_primary=0; packet->append(",\n ", 4); - if (i == primary_key && !strcmp(key_info->name,"PRIMARY")) + if (i == primary_key && !strcmp(key_info->name, primary_key_name)) { found_primary=1; packet->append("PRIMARY ", 8); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index be42de34899..413fb77d929 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -29,7 +29,7 @@ #include #endif -static const char *primary_key_name="PRIMARY"; +const char *primary_key_name= "PRIMARY"; static bool check_if_keyname_exists(const char *name,KEY *start, KEY *end); static char *make_unique_key_name(const char *field_name,KEY *start,KEY *end); @@ -2244,8 +2244,8 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, { char *key_name= key_info->name; - if (drop_primary && !my_strcasecmp(system_charset_info, key_name, - "PRIMARY")) + if (drop_primary && (key_info-> flags & HA_NOSAME) && + !my_strcasecmp(system_charset_info, key_name, primary_key_name)) { drop_primary= 0; continue; @@ -2305,7 +2305,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, key_list.push_back(new Key(key_info->flags & HA_SPATIAL ? Key::SPATIAL : (key_info->flags & HA_NOSAME ? (!my_strcasecmp(system_charset_info, - key_name, "PRIMARY") ? + key_name, primary_key_name) ? Key::PRIMARY : Key::UNIQUE) : (key_info->flags & HA_FULLTEXT ? Key::FULLTEXT : Key::MULTIPLE)), diff --git a/sql/table.cc b/sql/table.cc index 912c133e571..1127349db20 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -481,8 +481,8 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, /* Fix key->name and key_part->field */ if (key_parts) { - uint primary_key=(uint) (find_type((char*) "PRIMARY",&outparam->keynames, - 3)-1); + uint primary_key=(uint) (find_type((char*) primary_key_name, + &outparam->keynames, 3) - 1); uint ha_option=outparam->file->table_flags(); keyinfo=outparam->key_info; key_part=keyinfo->key_part;