mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge 5.0-bugteam -> 5.1-bugteam.
This commit is contained in:
@ -988,6 +988,17 @@ m1 CREATE TABLE `m1` (
|
|||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t1, m1;
|
DROP TABLE t1, m1;
|
||||||
|
CREATE TABLE t1(a INT);
|
||||||
|
CREATE TABLE t2(a VARCHAR(10));
|
||||||
|
CREATE TABLE m1(a INT) ENGINE=MERGE UNION=(t1, t2);
|
||||||
|
CREATE TABLE m2(a INT) ENGINE=MERGE UNION=(t1);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a
|
||||||
|
SELECT * FROM m1;
|
||||||
|
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
|
||||||
|
SELECT * FROM m2;
|
||||||
|
a
|
||||||
|
DROP TABLE t1, t2, m1, m2;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
create table t1 (c1 int, index(c1));
|
create table t1 (c1 int, index(c1));
|
||||||
create table t2 (c1 int, index(c1)) engine=merge union=(t1);
|
create table t2 (c1 int, index(c1)) engine=merge union=(t1);
|
||||||
|
@ -613,6 +613,19 @@ ALTER TABLE m1 UNION=();
|
|||||||
SHOW CREATE TABLE m1;
|
SHOW CREATE TABLE m1;
|
||||||
DROP TABLE t1, m1;
|
DROP TABLE t1, m1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#32047 - 'Spurious' errors while opening MERGE tables
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(a INT);
|
||||||
|
CREATE TABLE t2(a VARCHAR(10));
|
||||||
|
CREATE TABLE m1(a INT) ENGINE=MERGE UNION=(t1, t2);
|
||||||
|
CREATE TABLE m2(a INT) ENGINE=MERGE UNION=(t1);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
--error ER_WRONG_MRG_TABLE
|
||||||
|
SELECT * FROM m1;
|
||||||
|
SELECT * FROM m2;
|
||||||
|
DROP TABLE t1, t2, m1, m2;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -47,6 +47,7 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
|
|||||||
MI_INFO *isam=0;
|
MI_INFO *isam=0;
|
||||||
uint found_merge_insert_method= 0;
|
uint found_merge_insert_method= 0;
|
||||||
size_t name_buff_length;
|
size_t name_buff_length;
|
||||||
|
my_bool bad_children= FALSE;
|
||||||
DBUG_ENTER("myrg_open");
|
DBUG_ENTER("myrg_open");
|
||||||
|
|
||||||
LINT_INIT(key_parts);
|
LINT_INIT(key_parts);
|
||||||
@ -97,13 +98,13 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
|
|||||||
fn_format(buff, buff, "", "", 0);
|
fn_format(buff, buff, "", "", 0);
|
||||||
if (!(isam=mi_open(buff,mode,(handle_locking?HA_OPEN_WAIT_IF_LOCKED:0))))
|
if (!(isam=mi_open(buff,mode,(handle_locking?HA_OPEN_WAIT_IF_LOCKED:0))))
|
||||||
{
|
{
|
||||||
my_errno= HA_ERR_WRONG_MRG_TABLE_DEF;
|
|
||||||
if (handle_locking & HA_OPEN_FOR_REPAIR)
|
if (handle_locking & HA_OPEN_FOR_REPAIR)
|
||||||
{
|
{
|
||||||
myrg_print_wrong_table(buff);
|
myrg_print_wrong_table(buff);
|
||||||
|
bad_children= TRUE;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
goto err;
|
goto bad_children;
|
||||||
}
|
}
|
||||||
if (!m_info) /* First file */
|
if (!m_info) /* First file */
|
||||||
{
|
{
|
||||||
@ -128,13 +129,13 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
|
|||||||
files++;
|
files++;
|
||||||
if (m_info->reclength != isam->s->base.reclength)
|
if (m_info->reclength != isam->s->base.reclength)
|
||||||
{
|
{
|
||||||
my_errno=HA_ERR_WRONG_MRG_TABLE_DEF;
|
|
||||||
if (handle_locking & HA_OPEN_FOR_REPAIR)
|
if (handle_locking & HA_OPEN_FOR_REPAIR)
|
||||||
{
|
{
|
||||||
myrg_print_wrong_table(buff);
|
myrg_print_wrong_table(buff);
|
||||||
|
bad_children= TRUE;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
goto err;
|
goto bad_children;
|
||||||
}
|
}
|
||||||
m_info->options|= isam->s->options;
|
m_info->options|= isam->s->options;
|
||||||
m_info->records+= isam->state->records;
|
m_info->records+= isam->state->records;
|
||||||
@ -147,8 +148,8 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
|
|||||||
m_info->tables);
|
m_info->tables);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (my_errno == HA_ERR_WRONG_MRG_TABLE_DEF)
|
if (bad_children)
|
||||||
goto err;
|
goto bad_children;
|
||||||
if (!m_info && !(m_info= (MYRG_INFO*) my_malloc(sizeof(MYRG_INFO),
|
if (!m_info && !(m_info= (MYRG_INFO*) my_malloc(sizeof(MYRG_INFO),
|
||||||
MYF(MY_WME | MY_ZEROFILL))))
|
MYF(MY_WME | MY_ZEROFILL))))
|
||||||
goto err;
|
goto err;
|
||||||
@ -178,12 +179,14 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
|
|||||||
pthread_mutex_unlock(&THR_LOCK_open);
|
pthread_mutex_unlock(&THR_LOCK_open);
|
||||||
DBUG_RETURN(m_info);
|
DBUG_RETURN(m_info);
|
||||||
|
|
||||||
|
bad_children:
|
||||||
|
my_errno= HA_ERR_WRONG_MRG_TABLE_DEF;
|
||||||
err:
|
err:
|
||||||
save_errno=my_errno;
|
save_errno=my_errno;
|
||||||
switch (errpos) {
|
switch (errpos) {
|
||||||
case 3:
|
case 3:
|
||||||
while (files)
|
while (files)
|
||||||
mi_close(m_info->open_tables[--files].table);
|
(void) mi_close(m_info->open_tables[--files].table);
|
||||||
my_free((char*) m_info,MYF(0));
|
my_free((char*) m_info,MYF(0));
|
||||||
/* Fall through */
|
/* Fall through */
|
||||||
case 2:
|
case 2:
|
||||||
@ -392,6 +395,7 @@ int myrg_attach_children(MYRG_INFO *m_info, int handle_locking,
|
|||||||
uint child_nr;
|
uint child_nr;
|
||||||
uint key_parts;
|
uint key_parts;
|
||||||
uint min_keys;
|
uint min_keys;
|
||||||
|
my_bool bad_children= FALSE;
|
||||||
DBUG_ENTER("myrg_attach_children");
|
DBUG_ENTER("myrg_attach_children");
|
||||||
DBUG_PRINT("myrg", ("handle_locking: %d", handle_locking));
|
DBUG_PRINT("myrg", ("handle_locking: %d", handle_locking));
|
||||||
|
|
||||||
@ -441,13 +445,13 @@ int myrg_attach_children(MYRG_INFO *m_info, int handle_locking,
|
|||||||
DBUG_PRINT("error", ("definition mismatch table: '%s' repair: %d",
|
DBUG_PRINT("error", ("definition mismatch table: '%s' repair: %d",
|
||||||
myisam->filename,
|
myisam->filename,
|
||||||
(handle_locking & HA_OPEN_FOR_REPAIR)));
|
(handle_locking & HA_OPEN_FOR_REPAIR)));
|
||||||
my_errno= HA_ERR_WRONG_MRG_TABLE_DEF;
|
|
||||||
if (handle_locking & HA_OPEN_FOR_REPAIR)
|
if (handle_locking & HA_OPEN_FOR_REPAIR)
|
||||||
{
|
{
|
||||||
myrg_print_wrong_table(myisam->filename);
|
myrg_print_wrong_table(myisam->filename);
|
||||||
|
bad_children= TRUE;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
goto err;
|
goto bad_children;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_info->options|= myisam->s->options;
|
m_info->options|= myisam->s->options;
|
||||||
@ -462,6 +466,9 @@ int myrg_attach_children(MYRG_INFO *m_info, int handle_locking,
|
|||||||
child_nr++;
|
child_nr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bad_children)
|
||||||
|
goto bad_children;
|
||||||
|
/* Note: callback() resets my_errno, so it is safe to check it here */
|
||||||
if (my_errno == HA_ERR_WRONG_MRG_TABLE_DEF)
|
if (my_errno == HA_ERR_WRONG_MRG_TABLE_DEF)
|
||||||
goto err;
|
goto err;
|
||||||
if (sizeof(my_off_t) == 4 && file_offset > (ulonglong) (ulong) ~0L)
|
if (sizeof(my_off_t) == 4 && file_offset > (ulonglong) (ulong) ~0L)
|
||||||
@ -477,6 +484,8 @@ int myrg_attach_children(MYRG_INFO *m_info, int handle_locking,
|
|||||||
pthread_mutex_unlock(&m_info->mutex);
|
pthread_mutex_unlock(&m_info->mutex);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
|
bad_children:
|
||||||
|
my_errno= HA_ERR_WRONG_MRG_TABLE_DEF;
|
||||||
err:
|
err:
|
||||||
save_errno= my_errno;
|
save_errno= my_errno;
|
||||||
switch (errpos) {
|
switch (errpos) {
|
||||||
|
Reference in New Issue
Block a user