From 46ad86f6a35aff59ecb68a23dba228e5796e935a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Sat, 8 Aug 2015 12:49:20 +0300 Subject: [PATCH] MDEV-8582: innodb_force_primary_key option does not force PK or unique key Analysis: Handler used table flag HA_REQUIRE_PRIMARY_KEY but a bug on sql_table.cc function mysql_prepare_create_table internally marked secondary key with NOT NULL colums as unique key and did not then fail on requirement that table should have primary key or unique key. --- sql/sql_table.cc | 2 +- storage/innobase/handler/ha_innodb.cc | 5 ----- storage/xtradb/handler/ha_innodb.cc | 5 ----- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index a62c993ecfd..019650ae0c2 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4042,7 +4042,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, my_error(ER_WRONG_NAME_FOR_INDEX, MYF(0), key_info->name); DBUG_RETURN(TRUE); } - if (!(key_info->flags & HA_NULL_PART_KEY)) + if (key->type == Key::UNIQUE && !(key_info->flags & HA_NULL_PART_KEY)) unique_key=1; key_info->key_length=(uint16) key_length; if (key_length > max_key_length && key->type != Key::FULLTEXT) diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index fc8eb2a5b05..398b303897f 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -11134,11 +11134,6 @@ index_bad: } } - if (srv_force_primary_key && form->s->primary_key >= MAX_KEY) { - my_error(ER_REQUIRES_PRIMARY_KEY, MYF(0)); - DBUG_RETURN(false); - } - row_format = form->s->row_type; if (create_info->key_block_size) { diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index e38a3954069..6ee8d397368 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -11645,11 +11645,6 @@ index_bad: } } - if (srv_force_primary_key && form->s->primary_key >= MAX_KEY) { - my_error(ER_REQUIRES_PRIMARY_KEY, MYF(0)); - DBUG_RETURN(false); - } - row_format = form->s->row_type; if (create_info->key_block_size) {