Commit ad7a4ebb authored by unknown's avatar unknown

Merge bk-internal.mysql.com:/home/bk/mysql-5.0-engines

into  chilla.local:/home/mydev/mysql-5.0-axmrg

parents 1042a25a 8233b914
...@@ -772,7 +772,7 @@ CREATE TABLE t1(a INT); ...@@ -772,7 +772,7 @@ CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES(2),(1); INSERT INTO t1 VALUES(2),(1);
CREATE TABLE t2(a INT, KEY(a)) ENGINE=MERGE UNION=(t1); CREATE TABLE t2(a INT, KEY(a)) ENGINE=MERGE UNION=(t1);
SELECT * FROM t2 WHERE a=2; SELECT * FROM t2 WHERE a=2;
ERROR HY000: Got error 124 from storage engine ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
DROP TABLE t1, t2; DROP TABLE t1, t2;
CREATE TABLE t1(a INT) ENGINE=MEMORY; CREATE TABLE t1(a INT) ENGINE=MEMORY;
CREATE TABLE t2(a INT) ENGINE=MERGE UNION=(t1); CREATE TABLE t2(a INT) ENGINE=MERGE UNION=(t1);
...@@ -783,6 +783,26 @@ CREATE TABLE t2(a INT) ENGINE=MERGE UNION=(t3); ...@@ -783,6 +783,26 @@ CREATE TABLE t2(a INT) ENGINE=MERGE UNION=(t3);
SELECT * FROM t2; SELECT * FROM t2;
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
DROP TABLE t2; DROP TABLE t2;
CREATE TABLE t1(a INT, b TEXT);
CREATE TABLE tm1(a TEXT, b INT) ENGINE=MERGE UNION=(t1);
SELECT * FROM tm1;
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
DROP TABLE t1, tm1;
CREATE TABLE t1(a SMALLINT, b SMALLINT);
CREATE TABLE tm1(a INT) ENGINE=MERGE UNION=(t1);
SELECT * FROM tm1;
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
DROP TABLE t1, tm1;
CREATE TABLE t1(a SMALLINT, b SMALLINT, KEY(a, b));
CREATE TABLE tm1(a SMALLINT, b SMALLINT, KEY(a)) ENGINE=MERGE UNION=(t1);
SELECT * FROM tm1;
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
DROP TABLE t1, tm1;
CREATE TABLE t1(a SMALLINT, b SMALLINT, KEY(b));
CREATE TABLE tm1(a SMALLINT, b SMALLINT, KEY(a)) ENGINE=MERGE UNION=(t1);
SELECT * FROM tm1;
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
DROP TABLE t1, tm1;
create table t1 (b bit(1)); create table t1 (b bit(1));
create table t2 (b bit(1)); create table t2 (b bit(1));
create table tm (b bit(1)) engine = merge union = (t1,t2); create table tm (b bit(1)) engine = merge union = (t1,t2);
......
...@@ -385,7 +385,7 @@ drop table t1, t2, t3; ...@@ -385,7 +385,7 @@ drop table t1, t2, t3;
CREATE TABLE t1(a INT); CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES(2),(1); INSERT INTO t1 VALUES(2),(1);
CREATE TABLE t2(a INT, KEY(a)) ENGINE=MERGE UNION=(t1); CREATE TABLE t2(a INT, KEY(a)) ENGINE=MERGE UNION=(t1);
--error 1030 --error 1168
SELECT * FROM t2 WHERE a=2; SELECT * FROM t2 WHERE a=2;
DROP TABLE t1, t2; DROP TABLE t1, t2;
...@@ -403,6 +403,33 @@ CREATE TABLE t2(a INT) ENGINE=MERGE UNION=(t3); ...@@ -403,6 +403,33 @@ CREATE TABLE t2(a INT) ENGINE=MERGE UNION=(t3);
SELECT * FROM t2; SELECT * FROM t2;
DROP TABLE t2; DROP TABLE t2;
#
# Underlying table definition conformance tests.
#
CREATE TABLE t1(a INT, b TEXT);
CREATE TABLE tm1(a TEXT, b INT) ENGINE=MERGE UNION=(t1);
--error 1168
SELECT * FROM tm1;
DROP TABLE t1, tm1;
CREATE TABLE t1(a SMALLINT, b SMALLINT);
CREATE TABLE tm1(a INT) ENGINE=MERGE UNION=(t1);
--error 1168
SELECT * FROM tm1;
DROP TABLE t1, tm1;
CREATE TABLE t1(a SMALLINT, b SMALLINT, KEY(a, b));
CREATE TABLE tm1(a SMALLINT, b SMALLINT, KEY(a)) ENGINE=MERGE UNION=(t1);
--error 1168
SELECT * FROM tm1;
DROP TABLE t1, tm1;
CREATE TABLE t1(a SMALLINT, b SMALLINT, KEY(b));
CREATE TABLE tm1(a SMALLINT, b SMALLINT, KEY(a)) ENGINE=MERGE UNION=(t1);
--error 1168
SELECT * FROM tm1;
DROP TABLE t1, tm1;
# End of 4.1 tests # End of 4.1 tests
# #
......
This diff is collapsed.
...@@ -66,6 +66,12 @@ static const char *ha_myisammrg_exts[] = { ...@@ -66,6 +66,12 @@ static const char *ha_myisammrg_exts[] = {
".MRG", ".MRG",
NullS NullS
}; };
extern int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out,
MI_COLUMNDEF **recinfo_out, uint *records_out);
extern int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo,
uint t1_keys, uint t1_recs,
MI_KEYDEF *t2_keyinfo, MI_COLUMNDEF *t2_recinfo,
uint t2_keys, uint t2_recs, bool strict);
const char **ha_myisammrg::bas_ext() const const char **ha_myisammrg::bas_ext() const
{ {
...@@ -87,6 +93,12 @@ const char *ha_myisammrg::index_type(uint key_number) ...@@ -87,6 +93,12 @@ const char *ha_myisammrg::index_type(uint key_number)
int ha_myisammrg::open(const char *name, int mode, uint test_if_locked) int ha_myisammrg::open(const char *name, int mode, uint test_if_locked)
{ {
MI_KEYDEF *keyinfo;
MI_COLUMNDEF *recinfo;
MYRG_TABLE *u_table;
uint recs;
uint keys= table->s->keys;
int error;
char name_buff[FN_REFLEN]; char name_buff[FN_REFLEN];
DBUG_PRINT("info", ("ha_myisammrg::open")); DBUG_PRINT("info", ("ha_myisammrg::open"));
...@@ -109,18 +121,43 @@ int ha_myisammrg::open(const char *name, int mode, uint test_if_locked) ...@@ -109,18 +121,43 @@ int ha_myisammrg::open(const char *name, int mode, uint test_if_locked)
{ {
DBUG_PRINT("error",("reclength: %lu mean_rec_length: %lu", DBUG_PRINT("error",("reclength: %lu mean_rec_length: %lu",
table->s->reclength, mean_rec_length)); table->s->reclength, mean_rec_length));
error= HA_ERR_WRONG_MRG_TABLE_DEF;
goto err; goto err;
} }
if ((error= table2myisam(table, &keyinfo, &recinfo, &recs)))
{
/* purecov: begin inspected */
DBUG_PRINT("error", ("Failed to convert TABLE object to MyISAM "
"key and column definition"));
goto err;
/* purecov: end */
}
for (u_table= file->open_tables; u_table < file->end_table; u_table++)
{
if (check_definition(keyinfo, recinfo, keys, recs,
u_table->table->s->keyinfo, u_table->table->s->rec,
u_table->table->s->base.keys,
u_table->table->s->base.fields, false))
{
my_free((gptr) recinfo, MYF(0));
error= HA_ERR_WRONG_MRG_TABLE_DEF;
goto err;
}
}
my_free((gptr) recinfo, MYF(0));
#if !defined(BIG_TABLES) || SIZEOF_OFF_T == 4 #if !defined(BIG_TABLES) || SIZEOF_OFF_T == 4
/* Merge table has more than 2G rows */ /* Merge table has more than 2G rows */
if (table->s->crashed) if (table->s->crashed)
{
error= HA_ERR_WRONG_MRG_TABLE_DEF;
goto err; goto err;
}
#endif #endif
return (0); return (0);
err: err:
myrg_close(file); myrg_close(file);
file=0; file=0;
return (my_errno= HA_ERR_WRONG_MRG_TABLE_DEF); return (my_errno= error);
} }
int ha_myisammrg::close(void) int ha_myisammrg::close(void)
......
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