Commit d553b667 authored by unknown's avatar unknown

Move handler specific options into handlerton flag check

BUG#13108


mysql-test/r/federated.result:
  added test results for federated alter table
mysql-test/t/federated.test:
  added test for federated alter table
sql/examples/ha_example.cc:
  supports table re-creation
sql/examples/ha_tina.cc:
  supports table re-creation
sql/ha_blackhole.cc:
  supports table re-creation
sql/ha_federated.cc:
  added flag for not supporting alter
sql/ha_heap.cc:
  supports table recreation
sql/ha_myisam.cc:
  supports table recreation
sql/ha_myisammrg.cc:
  supports table re-creation
sql/handler.cc:
  implemented flag check function
sql/handler.h:
  added additional handlerton flags
  created a function to test flags
  replace ha_supports_generate macro with call to flag check
sql/sql_delete.cc:
  replaced ha_supports_generate with handlerton flag check
sql/sql_table.cc:
  added check for handlerton check for alter support
parent 7d3c939e
...@@ -1457,6 +1457,32 @@ federated.t1 repair status OK ...@@ -1457,6 +1457,32 @@ federated.t1 repair status OK
REPAIR TABLE federated.t1 USE_FRM; REPAIR TABLE federated.t1 USE_FRM;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
federated.t1 repair status OK federated.t1 repair status OK
DROP TABLE IF EXISTS federated.normal_table;
CREATE TABLE federated.normal_table (
`id` int(4) NOT NULL,
`name` varchar(10) default NULL
) DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS federated.alter_me;
CREATE TABLE federated.alter_me (
`id` int(4) NOT NULL,
`name` varchar(10) default NULL,
PRIMARY KEY (`id`)
) ENGINE="FEDERATED" DEFAULT CHARSET=latin1
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/federated/normal_table';
INSERT INTO federated.alter_me (id, name) VALUES (1, 'Monty');
INSERT INTO federated.alter_me (id, name) VALUES (2, 'David');
SELECT * FROM federated.alter_me;
id name
1 Monty
2 David
ALTER TABLE federated.alter_me MODIFY COLUMN id int(16) NOT NULL;
ERROR HY000: Table storage engine for 'alter_me' doesn't have this option
SELECT * FROM federated.alter_me;
id name
1 Monty
2 David
DROP TABLE federated.alter_me;
DROP TABLE federated.normal_table;
DROP TABLE IF EXISTS federated.t1; DROP TABLE IF EXISTS federated.t1;
DROP DATABASE IF EXISTS federated; DROP DATABASE IF EXISTS federated;
DROP TABLE IF EXISTS federated.t1; DROP TABLE IF EXISTS federated.t1;
......
...@@ -1137,11 +1137,53 @@ ORDER BY federated.t1.country_id; ...@@ -1137,11 +1137,53 @@ ORDER BY federated.t1.country_id;
DROP TABLE federated.countries; DROP TABLE federated.countries;
# optimize and repair tests #BEGIN optimize and repair tests
OPTIMIZE TABLE federated.t1; OPTIMIZE TABLE federated.t1;
REPAIR TABLE federated.t1; REPAIR TABLE federated.t1;
REPAIR TABLE federated.t1 QUICK; REPAIR TABLE federated.t1 QUICK;
REPAIR TABLE federated.t1 EXTENDED; REPAIR TABLE federated.t1 EXTENDED;
REPAIR TABLE federated.t1 USE_FRM; REPAIR TABLE federated.t1 USE_FRM;
#END optimize and repair tests
# BEGIN ALTER TEST
connection slave;
--disable_warnings
DROP TABLE IF EXISTS federated.normal_table;
--enable_warnings
CREATE TABLE federated.normal_table (
`id` int(4) NOT NULL,
`name` varchar(10) default NULL
) DEFAULT CHARSET=latin1;
connection master;
--disable_warnings
DROP TABLE IF EXISTS federated.alter_me;
--enable_warnings
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval CREATE TABLE federated.alter_me (
`id` int(4) NOT NULL,
`name` varchar(10) default NULL,
PRIMARY KEY (`id`)
) ENGINE="FEDERATED" DEFAULT CHARSET=latin1
CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/normal_table';
INSERT INTO federated.alter_me (id, name) VALUES (1, 'Monty');
INSERT INTO federated.alter_me (id, name) VALUES (2, 'David');
SELECT * FROM federated.alter_me;
--error 1031
ALTER TABLE federated.alter_me MODIFY COLUMN id int(16) NOT NULL;
SELECT * FROM federated.alter_me;
DROP TABLE federated.alter_me;
connection slave;
DROP TABLE federated.normal_table;
# END ALTER TEST
source include/federated_cleanup.inc; source include/federated_cleanup.inc;
...@@ -90,7 +90,7 @@ handlerton example_hton= { ...@@ -90,7 +90,7 @@ handlerton example_hton= {
NULL, /* create_cursor_read_view */ NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */ NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */ NULL, /* close_cursor_read_view */
HTON_NO_FLAGS HTON_CAN_RECREATE
}; };
/* Variables for example share methods */ /* Variables for example share methods */
......
...@@ -71,7 +71,7 @@ handlerton tina_hton= { ...@@ -71,7 +71,7 @@ handlerton tina_hton= {
NULL, /* create_cursor_read_view */ NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */ NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */ NULL, /* close_cursor_read_view */
HTON_NO_FLAGS HTON_CAN_RECREATE
}; };
/***************************************************************************** /*****************************************************************************
......
...@@ -43,7 +43,7 @@ handlerton blackhole_hton= { ...@@ -43,7 +43,7 @@ handlerton blackhole_hton= {
NULL, /* create_cursor_read_view */ NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */ NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */ NULL, /* close_cursor_read_view */
HTON_NO_FLAGS HTON_CAN_RECREATE
}; };
/***************************************************************************** /*****************************************************************************
......
...@@ -713,7 +713,7 @@ handlerton federated_hton= { ...@@ -713,7 +713,7 @@ handlerton federated_hton= {
NULL, /* create_cursor_read_view */ NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */ NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */ NULL, /* close_cursor_read_view */
HTON_NO_FLAGS HTON_ALTER_NOT_SUPPORTED
}; };
......
...@@ -40,7 +40,7 @@ handlerton heap_hton= { ...@@ -40,7 +40,7 @@ handlerton heap_hton= {
NULL, /* create_cursor_read_view */ NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */ NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */ NULL, /* close_cursor_read_view */
HTON_NO_FLAGS HTON_CAN_RECREATE
}; };
/***************************************************************************** /*****************************************************************************
......
...@@ -73,7 +73,7 @@ handlerton myisam_hton= { ...@@ -73,7 +73,7 @@ handlerton myisam_hton= {
MyISAM doesn't support transactions and doesn't have MyISAM doesn't support transactions and doesn't have
transaction-dependent context: cursors can survive a commit. transaction-dependent context: cursors can survive a commit.
*/ */
HTON_NO_FLAGS HTON_CAN_RECREATE
}; };
// collect errors printed by mi_check routines // collect errors printed by mi_check routines
......
...@@ -51,7 +51,7 @@ handlerton myisammrg_hton= { ...@@ -51,7 +51,7 @@ handlerton myisammrg_hton= {
NULL, /* create_cursor_read_view */ NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */ NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */ NULL, /* close_cursor_read_view */
HTON_NO_FLAGS HTON_CAN_RECREATE
}; };
......
...@@ -183,6 +183,23 @@ const char *ha_get_storage_engine(enum db_type db_type) ...@@ -183,6 +183,23 @@ const char *ha_get_storage_engine(enum db_type db_type)
return "none"; return "none";
} }
bool ha_check_storage_engine_flag(enum db_type db_type, uint32 flag)
{
show_table_type_st *types;
for (types= sys_table_types; types->type; types++)
{
if (db_type == types->db_type)
{
if (types->ht->flags & flag)
return TRUE;
else
return FALSE;
}
}
return FALSE;
}
my_bool ha_storage_engine_is_enabled(enum db_type database_type) my_bool ha_storage_engine_is_enabled(enum db_type database_type)
{ {
......
...@@ -377,8 +377,10 @@ struct show_table_alias_st { ...@@ -377,8 +377,10 @@ struct show_table_alias_st {
}; };
/* Possible flags of a handlerton */ /* Possible flags of a handlerton */
#define HTON_NO_FLAGS 0 #define HTON_NO_FLAGS 0
#define HTON_CLOSE_CURSORS_AT_COMMIT 1 #define HTON_CLOSE_CURSORS_AT_COMMIT (1 << 0)
#define HTON_ALTER_NOT_SUPPORTED (1 << 1)
#define HTON_CAN_RECREATE (1 << 2)
typedef struct st_thd_trans typedef struct st_thd_trans
{ {
...@@ -848,18 +850,13 @@ extern ulong total_ha, total_ha_2pc; ...@@ -848,18 +850,13 @@ extern ulong total_ha, total_ha_2pc;
#define ha_commit(thd) (ha_commit_trans((thd), TRUE)) #define ha_commit(thd) (ha_commit_trans((thd), TRUE))
#define ha_rollback(thd) (ha_rollback_trans((thd), TRUE)) #define ha_rollback(thd) (ha_rollback_trans((thd), TRUE))
#define ha_supports_generate(T) (T != DB_TYPE_INNODB && \
T != DB_TYPE_BERKELEY_DB && \
T != DB_TYPE_ARCHIVE_DB && \
T != DB_TYPE_FEDERATED_DB && \
T != DB_TYPE_NDBCLUSTER)
/* lookups */ /* lookups */
enum db_type ha_resolve_by_name(const char *name, uint namelen); enum db_type ha_resolve_by_name(const char *name, uint namelen);
const char *ha_get_storage_engine(enum db_type db_type); const char *ha_get_storage_engine(enum db_type db_type);
handler *get_new_handler(TABLE *table, enum db_type db_type); handler *get_new_handler(TABLE *table, enum db_type db_type);
enum db_type ha_checktype(THD *thd, enum db_type database_type, enum db_type ha_checktype(THD *thd, enum db_type database_type,
bool no_substitute, bool report_error); bool no_substitute, bool report_error);
bool ha_check_storage_engine_flag(enum db_type db_type, uint32 flag);
/* basic stuff */ /* basic stuff */
int ha_init(void); int ha_init(void);
......
...@@ -787,7 +787,7 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok) ...@@ -787,7 +787,7 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
TABLE *table= *table_ptr; TABLE *table= *table_ptr;
table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK); table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK);
db_type table_type= table->s->db_type; db_type table_type= table->s->db_type;
if (!ha_supports_generate(table_type)) if (!ha_check_storage_engine_flag(table_type, HTON_CAN_RECREATE))
goto trunc_by_del; goto trunc_by_del;
strmov(path, table->s->path); strmov(path, table->s->path);
*table_ptr= table->next; // Unlink table from list *table_ptr= table->next; // Unlink table from list
...@@ -818,7 +818,8 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok) ...@@ -818,7 +818,8 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
table_list->db, table_list->table_name); table_list->db, table_list->table_name);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
if (!ha_supports_generate(table_type) || thd->lex->sphead) if (!ha_check_storage_engine_flag(table_type, HTON_CAN_RECREATE)
|| thd->lex->sphead)
goto trunc_by_del; goto trunc_by_del;
if (lock_and_wait_for_table_name(thd, table_list)) if (lock_and_wait_for_table_name(thd, table_list))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
......
...@@ -3156,6 +3156,16 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -3156,6 +3156,16 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
if (create_info->row_type == ROW_TYPE_NOT_USED) if (create_info->row_type == ROW_TYPE_NOT_USED)
create_info->row_type= table->s->row_type; create_info->row_type= table->s->row_type;
DBUG_PRINT("info", ("old type: %d new type: %d", old_db_type, new_db_type));
if (ha_check_storage_engine_flag(old_db_type, HTON_ALTER_NOT_SUPPORTED)
|| ha_check_storage_engine_flag(new_db_type, HTON_ALTER_NOT_SUPPORTED))
{
DBUG_PRINT("info", ("doesn't support alter"));
my_error(ER_ILLEGAL_HA, MYF(0), table_name);
DBUG_RETURN(TRUE);
}
DBUG_PRINT("info", ("supports alter"));
thd->proc_info="setup"; thd->proc_info="setup";
if (!(alter_info->flags & ~(ALTER_RENAME | ALTER_KEYS_ONOFF)) && if (!(alter_info->flags & ~(ALTER_RENAME | ALTER_KEYS_ONOFF)) &&
!table->s->tmp_table) // no need to touch frm !table->s->tmp_table) // no need to touch frm
......
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