mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Move handler specific options into handlerton flag check
BUG#13108
This commit is contained in:
@ -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;
|
|||||||
|
|
||||||
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= {
|
|||||||
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= {
|
|||||||
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= {
|
|||||||
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= {
|
|||||||
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= {
|
|||||||
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= {
|
|||||||
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= {
|
|||||||
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)
|
|||||||
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)
|
||||||
{
|
{
|
||||||
|
@ -378,7 +378,9 @@ 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;
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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
|
||||||
|
Reference in New Issue
Block a user