summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <kent@mysql.com>2005-10-03 10:39:35 +0200
committerunknown <kent@mysql.com>2005-10-03 10:39:35 +0200
commit47e822ecab7b1acacea931ef273e128e9d68a6f8 (patch)
tree87901579f178b3121f7431f479d25ced6025061e
parent0c5470aa2e60b32e170418c5c25183dd21737deb (diff)
parent05df35e3d67ce8519e3281be29b599c3283db039 (diff)
downloadmariadb-git-47e822ecab7b1acacea931ef273e128e9d68a6f8.tar.gz
Merge kboortz@bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/Users/kent/mysql/bk/mysql-5.0 sql/handler.h: Auto merged
-rw-r--r--mysql-test/r/federated.result26
-rw-r--r--mysql-test/t/federated.test44
-rw-r--r--sql/examples/ha_example.cc2
-rw-r--r--sql/examples/ha_tina.cc2
-rw-r--r--sql/ha_blackhole.cc2
-rw-r--r--sql/ha_federated.cc2
-rw-r--r--sql/ha_heap.cc2
-rw-r--r--sql/ha_myisam.cc2
-rw-r--r--sql/ha_myisammrg.cc2
-rw-r--r--sql/handler.cc17
-rw-r--r--sql/handler.h13
-rw-r--r--sql/sql_delete.cc5
-rw-r--r--sql/sql_table.cc10
13 files changed, 111 insertions, 18 deletions
diff --git a/mysql-test/r/federated.result b/mysql-test/r/federated.result
index 1ec9857c8a7..e0e0bba3271 100644
--- a/mysql-test/r/federated.result
+++ b/mysql-test/r/federated.result
@@ -1457,6 +1457,32 @@ federated.t1 repair status OK
REPAIR TABLE federated.t1 USE_FRM;
Table Op Msg_type Msg_text
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 DATABASE IF EXISTS federated;
DROP TABLE IF EXISTS federated.t1;
diff --git a/mysql-test/t/federated.test b/mysql-test/t/federated.test
index 28091676dd7..c401468a940 100644
--- a/mysql-test/t/federated.test
+++ b/mysql-test/t/federated.test
@@ -1137,11 +1137,53 @@ ORDER BY federated.t1.country_id;
DROP TABLE federated.countries;
-# optimize and repair tests
+#BEGIN optimize and repair tests
OPTIMIZE TABLE federated.t1;
REPAIR TABLE federated.t1;
REPAIR TABLE federated.t1 QUICK;
REPAIR TABLE federated.t1 EXTENDED;
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;
diff --git a/sql/examples/ha_example.cc b/sql/examples/ha_example.cc
index cc4ad3eb535..d809398b69f 100644
--- a/sql/examples/ha_example.cc
+++ b/sql/examples/ha_example.cc
@@ -90,7 +90,7 @@ handlerton example_hton= {
NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */
- HTON_NO_FLAGS
+ HTON_CAN_RECREATE
};
/* Variables for example share methods */
diff --git a/sql/examples/ha_tina.cc b/sql/examples/ha_tina.cc
index 5663cd829bd..559fdfbbbd9 100644
--- a/sql/examples/ha_tina.cc
+++ b/sql/examples/ha_tina.cc
@@ -71,7 +71,7 @@ handlerton tina_hton= {
NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */
- HTON_NO_FLAGS
+ HTON_CAN_RECREATE
};
/*****************************************************************************
diff --git a/sql/ha_blackhole.cc b/sql/ha_blackhole.cc
index f089b67d678..57882e638d7 100644
--- a/sql/ha_blackhole.cc
+++ b/sql/ha_blackhole.cc
@@ -43,7 +43,7 @@ handlerton blackhole_hton= {
NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */
- HTON_NO_FLAGS
+ HTON_CAN_RECREATE
};
/*****************************************************************************
diff --git a/sql/ha_federated.cc b/sql/ha_federated.cc
index 9a8b5eb794d..f2caca7f012 100644
--- a/sql/ha_federated.cc
+++ b/sql/ha_federated.cc
@@ -713,7 +713,7 @@ handlerton federated_hton= {
NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */
- HTON_NO_FLAGS
+ HTON_ALTER_NOT_SUPPORTED
};
diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc
index fafd597e858..ad7da559ff4 100644
--- a/sql/ha_heap.cc
+++ b/sql/ha_heap.cc
@@ -40,7 +40,7 @@ handlerton heap_hton= {
NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */
- HTON_NO_FLAGS
+ HTON_CAN_RECREATE
};
/*****************************************************************************
diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc
index 02769c1eb31..c9e69b377d0 100644
--- a/sql/ha_myisam.cc
+++ b/sql/ha_myisam.cc
@@ -73,7 +73,7 @@ handlerton myisam_hton= {
MyISAM doesn't support transactions and doesn't have
transaction-dependent context: cursors can survive a commit.
*/
- HTON_NO_FLAGS
+ HTON_CAN_RECREATE
};
// collect errors printed by mi_check routines
diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc
index 8347dcdaa3e..7a93015ecaa 100644
--- a/sql/ha_myisammrg.cc
+++ b/sql/ha_myisammrg.cc
@@ -51,7 +51,7 @@ handlerton myisammrg_hton= {
NULL, /* create_cursor_read_view */
NULL, /* set_cursor_read_view */
NULL, /* close_cursor_read_view */
- HTON_NO_FLAGS
+ HTON_CAN_RECREATE
};
diff --git a/sql/handler.cc b/sql/handler.cc
index 39d9b706ed2..5221ccbb7c5 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -183,6 +183,23 @@ const char *ha_get_storage_engine(enum db_type db_type)
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)
{
diff --git a/sql/handler.h b/sql/handler.h
index 9a9e0bb4f69..2d563e9da23 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -377,8 +377,10 @@ struct show_table_alias_st {
};
/* Possible flags of a handlerton */
-#define HTON_NO_FLAGS 0
-#define HTON_CLOSE_CURSORS_AT_COMMIT 1
+#define HTON_NO_FLAGS 0
+#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
{
@@ -848,18 +850,13 @@ extern ulong total_ha, total_ha_2pc;
#define ha_commit(thd) (ha_commit_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 */
enum db_type ha_resolve_by_name(const char *name, uint namelen);
const char *ha_get_storage_engine(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,
bool no_substitute, bool report_error);
+bool ha_check_storage_engine_flag(enum db_type db_type, uint32 flag);
/* basic stuff */
int ha_init(void);
diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc
index 4001a51f459..d9734b7cae8 100644
--- a/sql/sql_delete.cc
+++ b/sql/sql_delete.cc
@@ -787,7 +787,7 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
TABLE *table= *table_ptr;
table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK);
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;
strmov(path, table->s->path);
*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);
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;
if (lock_and_wait_for_table_name(thd, table_list))
DBUG_RETURN(TRUE);
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index dba4168343a..4438400806f 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -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)
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";
if (!(alter_info->flags & ~(ALTER_RENAME | ALTER_KEYS_ONOFF)) &&
!table->s->tmp_table) // no need to touch frm