summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/alter_table.result9
-rw-r--r--mysql-test/t/alter_table.test4
-rw-r--r--sql/mysql_priv.h1
-rw-r--r--sql/sql_base.cc4
-rw-r--r--sql/sql_lex.h2
-rw-r--r--sql/sql_parse.cc4
-rw-r--r--sql/sql_table.cc13
-rw-r--r--sql/sql_yacc.yy7
8 files changed, 20 insertions, 24 deletions
diff --git a/mysql-test/r/alter_table.result b/mysql-test/r/alter_table.result
index 33af0b30d1c..ce324dc1fa8 100644
--- a/mysql-test/r/alter_table.result
+++ b/mysql-test/r/alter_table.result
@@ -412,12 +412,15 @@ t1 0 PRIMARY 1 Host A NULL NULL NULL BTREE
t1 0 PRIMARY 2 User A 0 NULL NULL BTREE
t1 1 Host 1 Host A NULL NULL NULL BTREE disabled
DROP TABLE t1;
-CREATE TABLE t1 (a int UNIQUE);
+CREATE TABLE t1 (a int PRIMARY KEY, b INT UNIQUE);
ALTER TABLE t1 DROP PRIMARY KEY;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
- `a` int(11) default NULL,
- UNIQUE KEY `a` (`a`)
+ `a` int(11) NOT NULL default '0',
+ `b` int(11) default NULL,
+ UNIQUE KEY `b` (`b`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
+ALTER TABLE t1 DROP PRIMARY KEY;
+ERROR 42000: Can't DROP 'PRIMARY'. Check that column/key exists
DROP TABLE t1;
diff --git a/mysql-test/t/alter_table.test b/mysql-test/t/alter_table.test
index 71991973105..c013b2251a9 100644
--- a/mysql-test/t/alter_table.test
+++ b/mysql-test/t/alter_table.test
@@ -249,7 +249,9 @@ DROP TABLE t1;
# Bug 2361
#
-CREATE TABLE t1 (a int UNIQUE);
+CREATE TABLE t1 (a int PRIMARY KEY, b INT UNIQUE);
ALTER TABLE t1 DROP PRIMARY KEY;
SHOW CREATE TABLE t1;
+--error 1091
+ALTER TABLE t1 DROP PRIMARY KEY;
DROP TABLE t1;
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index e7faaf1767d..8963fea29f6 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -509,7 +509,6 @@ int mysql_alter_table(THD *thd, char *new_db, char *new_name,
List<Key> &keys,List<Alter_drop> &drop_list,
List<Alter_column> &alter_list,
uint order_num, ORDER *order,
- bool drop_primary,
enum enum_duplicates handle_duplicates,
enum enum_enable_or_disable keys_onoff=LEAVE_AS_IS,
enum tablespace_op_type tablespace_op=NO_TABLESPACE_OP,
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 3125c392751..2a4f73a986c 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -2395,7 +2395,7 @@ int mysql_create_index(THD *thd, TABLE_LIST *table_list, List<Key> &keys)
create_info.default_table_charset= thd->variables.collation_database;
DBUG_RETURN(mysql_alter_table(thd,table_list->db,table_list->real_name,
&create_info, table_list,
- fields, keys, drop, alter, 0, (ORDER*)0, FALSE,
+ fields, keys, drop, alter, 0, (ORDER*)0,
DUP_ERROR));
}
@@ -2412,7 +2412,7 @@ int mysql_drop_index(THD *thd, TABLE_LIST *table_list, List<Alter_drop> &drop)
create_info.default_table_charset= thd->variables.collation_database;
DBUG_RETURN(mysql_alter_table(thd,table_list->db,table_list->real_name,
&create_info, table_list,
- fields, keys, drop, alter, 0, (ORDER*)0, FALSE,
+ fields, keys, drop, alter, 0, (ORDER*)0,
DUP_ERROR));
}
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index bcbd60e9716..68385bc7bba 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -575,7 +575,7 @@ typedef struct st_lex
uint param_count;
uint slave_thd_opt;
uint8 describe;
- bool drop_primary, drop_if_exists, drop_temporary, local_file;
+ bool drop_if_exists, drop_temporary, local_file;
bool in_comment, ignore_space, verbose, simple_alter, no_write_to_binlog;
bool derived_tables;
bool safe_to_cache_query;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index cbf091069d6..2e728e4ae6d 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2319,7 +2319,7 @@ mysql_execute_command(THD *thd)
lex->key_list, lex->drop_list, lex->alter_list,
select_lex->order_list.elements,
(ORDER *) select_lex->order_list.first,
- lex->drop_primary, lex->duplicates,
+ lex->duplicates,
lex->alter_keys_onoff,
lex->tablespace_op,
lex->simple_alter);
@@ -2466,7 +2466,7 @@ mysql_execute_command(THD *thd)
tables, lex->create_list,
lex->key_list, lex->drop_list, lex->alter_list,
0, (ORDER *) 0,
- 0, DUP_ERROR);
+ DUP_ERROR);
}
else
res = mysql_optimize_table(thd, tables, &lex->check_opt);
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 60da32fceca..4e66154e2a2 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -1962,7 +1962,6 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
List<Key> &keys,List<Alter_drop> &drop_list,
List<Alter_column> &alter_list,
uint order_num, ORDER *order,
- bool drop_primary,
enum enum_duplicates handle_duplicates,
enum enum_enable_or_disable keys_onoff,
enum tablespace_op_type tablespace_op,
@@ -2171,7 +2170,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
def_it.rewind();
while ((def=def_it++))
{
- if (def->change &&
+ if (def->change &&
!my_strcasecmp(system_charset_info,field->field_name, def->change))
break;
}
@@ -2265,14 +2264,6 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
for (uint i=0 ; i < table->keys ; i++,key_info++)
{
char *key_name= key_info->name;
-
- if (drop_primary && (key_info-> flags & HA_NOSAME) &&
- !my_strcasecmp(system_charset_info, key_name, primary_key_name))
- {
- drop_primary= 0;
- continue;
- }
-
Alter_drop *drop;
drop_it.rewind();
while ((drop=drop_it++))
@@ -2315,7 +2306,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
{ // Check if sub key
if (cfield->field->type() != FIELD_TYPE_BLOB &&
(cfield->field->pack_length() == key_part_length ||
- cfield->length <= key_part_length /
+ cfield->length <= key_part_length /
key_part->field->charset()->mbmaxlen))
key_part_length=0; // Use whole field
}
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index fac0a7388c3..76a0f384b15 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -1689,7 +1689,6 @@ alter:
if (!lex->select_lex.add_table_to_list(thd, $4, NULL,
TL_OPTION_UPDATING))
YYABORT;
- lex->drop_primary=0;
lex->create_list.empty();
lex->key_list.empty();
lex->col_list.empty();
@@ -1761,12 +1760,14 @@ alter_list_item:
lex->drop_list.push_back(new Alter_drop(Alter_drop::COLUMN,
$3.str)); lex->simple_alter=0;
}
+ | DROP FOREIGN KEY_SYM opt_ident { Lex->simple_alter=0; }
| DROP PRIMARY_SYM KEY_SYM
{
LEX *lex=Lex;
- lex->drop_primary=1; lex->simple_alter=0;
+ lex->drop_list.push_back(new Alter_drop(Alter_drop::KEY,
+ primary_key_name));
+ lex->simple_alter=0;
}
- | DROP FOREIGN KEY_SYM opt_ident { Lex->simple_alter=0; }
| DROP key_or_index field_ident
{
LEX *lex=Lex;