diff options
-rw-r--r-- | include/my_base.h | 3 | ||||
-rw-r--r-- | mysql-test/r/merge.result | 12 | ||||
-rw-r--r-- | mysql-test/t/merge.test | 17 | ||||
-rw-r--r-- | sql/ha_myisammrg.cc | 4 | ||||
-rw-r--r-- | sql/handler.cc | 4 |
5 files changed, 38 insertions, 2 deletions
diff --git a/include/my_base.h b/include/my_base.h index 05ba38e77eb..d8a0e15ccbe 100644 --- a/include/my_base.h +++ b/include/my_base.h @@ -356,8 +356,9 @@ enum ha_base_keytype { #define HA_ERR_NULL_IN_SPATIAL 158 /* NULLs are not supported in spatial index */ #define HA_ERR_TABLE_DEF_CHANGED 159 /* The table changed in storage engine */ #define HA_ERR_TABLE_NEEDS_UPGRADE 160 /* The table changed in storage engine */ +#define HA_ERR_TABLE_READONLY 161 /* The table is not writable */ -#define HA_ERR_LAST 160 /*Copy last error nr.*/ +#define HA_ERR_LAST 161 /*Copy last error nr.*/ /* Add error numbers before HA_ERR_LAST and change it accordingly. */ #define HA_ERR_ERRORS (HA_ERR_LAST - HA_ERR_FIRST + 1) diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result index b1abe16a091..b8fdd24be74 100644 --- a/mysql-test/r/merge.result +++ b/mysql-test/r/merge.result @@ -774,3 +774,15 @@ create table tm (b bit(1)) engine = merge union = (t1,t2); select * from tm; b drop table tm, t1, t2; +create table t1 (a int) insert_method = last engine = merge; +insert into t1 values (1); +ERROR HY000: Table 't1' is read only +create table t2 (a int) engine = myisam; +alter table t1 union (t2); +insert into t1 values (1); +alter table t1 insert_method = no; +insert into t1 values (1); +ERROR HY000: Table 't1' is read only +drop table t2; +drop table t1; +End of 5.0 tests diff --git a/mysql-test/t/merge.test b/mysql-test/t/merge.test index 639129e1393..93fbc631680 100644 --- a/mysql-test/t/merge.test +++ b/mysql-test/t/merge.test @@ -389,4 +389,19 @@ create table tm (b bit(1)) engine = merge union = (t1,t2); select * from tm; drop table tm, t1, t2; -# End of 5.0 tests +# +# Bug #17766: The server accepts to create MERGE tables which cannot work +# +create table t1 (a int) insert_method = last engine = merge; +--error ER_OPEN_AS_READONLY +insert into t1 values (1); +create table t2 (a int) engine = myisam; +alter table t1 union (t2); +insert into t1 values (1); +alter table t1 insert_method = no; +--error ER_OPEN_AS_READONLY +insert into t1 values (1); +drop table t2; +drop table t1; + +--echo End of 5.0 tests diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc index 9780f163634..0b6e05fcbd4 100644 --- a/sql/ha_myisammrg.cc +++ b/sql/ha_myisammrg.cc @@ -132,6 +132,10 @@ int ha_myisammrg::close(void) int ha_myisammrg::write_row(byte * buf) { statistic_increment(table->in_use->status_var.ha_write_count,&LOCK_status); + + if (file->merge_insert_method == MERGE_INSERT_DISABLED || !file->tables) + return (HA_ERR_TABLE_READONLY); + if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_INSERT) table->timestamp_field->set_time(); if (table->next_number_field && buf == table->record[0]) diff --git a/sql/handler.cc b/sql/handler.cc index 9c03a9ef88f..01aa7491383 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -426,6 +426,7 @@ static int ha_init_errors(void) SETMSG(HA_ERR_NO_CONNECTION, "Could not connect to storage engine"); SETMSG(HA_ERR_TABLE_DEF_CHANGED, ER(ER_TABLE_DEF_CHANGED)); SETMSG(HA_ERR_TABLE_NEEDS_UPGRADE, ER(ER_TABLE_NEEDS_UPGRADE)); + SETMSG(HA_ERR_TABLE_READONLY, ER(ER_OPEN_AS_READONLY)); /* Register the error messages for use with my_error(). */ return my_error_register(errmsgs, HA_ERR_FIRST, HA_ERR_LAST); @@ -1858,6 +1859,9 @@ void handler::print_error(int error, myf errflag) case HA_ERR_TABLE_NEEDS_UPGRADE: textno=ER_TABLE_NEEDS_UPGRADE; break; + case HA_ERR_TABLE_READONLY: + textno= ER_OPEN_AS_READONLY; + break; default: { /* The error was "unknown" to this function. |