Commit b40895f9 authored by unknown's avatar unknown

bug #702 - ALTER TABLE tm UNION=(t1,t2) doesn't work if t1.MYD is compressed


myisammrg/myrg_open.c:
  never mark merge table as readonly even if all underlying myisam tables are readonly,
  otherwise ALTER TABLE merge UNION=(t1,t2,t3,...) will not work
sql/handler.cc:
  map EACCES to ER_OPEN_AS_READONLY.
  can only happen on modifying merge table that has (some) read-only myisam tables
parent d99608d2
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking) MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
{ {
int save_errno,i,errpos; int save_errno,i,errpos;
uint files,dir_length,length,options, key_parts; uint files,dir_length,length,key_parts;
ulonglong file_offset; ulonglong file_offset;
char name_buff[FN_REFLEN*2],buff[FN_REFLEN],*end; char name_buff[FN_REFLEN*2],buff[FN_REFLEN],*end;
MYRG_INFO info,*m_info; MYRG_INFO info,*m_info;
...@@ -110,13 +110,11 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking) ...@@ -110,13 +110,11 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
} }
errpos=2; errpos=2;
options= (uint) ~0;
for (i=files ; i-- > 0 ; ) for (i=files ; i-- > 0 ; )
{ {
uint j; uint j;
m_info->open_tables[i].table=isam; m_info->open_tables[i].table=isam;
m_info->options|=isam->s->options; m_info->options|=isam->s->options;
options&=isam->s->options;
m_info->records+=isam->state->records; m_info->records+=isam->state->records;
m_info->del+=isam->state->del; m_info->del+=isam->state->del;
m_info->data_file_length+=isam->state->data_file_length; m_info->data_file_length+=isam->state->data_file_length;
...@@ -125,9 +123,8 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking) ...@@ -125,9 +123,8 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
if (i) if (i)
isam=(MI_INFO*) (isam->open_list.next->data); isam=(MI_INFO*) (isam->open_list.next->data);
} }
/* Don't force readonly if not all tables are readonly */ /* Don't mark table readonly, for ALTER TABLE ... UNION=(...) to work */
if (! (options & (HA_OPTION_COMPRESS_RECORD | HA_OPTION_READ_ONLY_DATA))) m_info->options&= ~(HA_OPTION_COMPRESS_RECORD | HA_OPTION_READ_ONLY_DATA);
m_info->options&= ~(HA_OPTION_COMPRESS_RECORD | HA_OPTION_READ_ONLY_DATA);
/* Fix fileinfo for easyer debugging (actually set by rrnd) */ /* Fix fileinfo for easyer debugging (actually set by rrnd) */
file_offset=0; file_offset=0;
......
...@@ -801,6 +801,9 @@ void handler::print_error(int error, myf errflag) ...@@ -801,6 +801,9 @@ void handler::print_error(int error, myf errflag)
int textno=ER_GET_ERRNO; int textno=ER_GET_ERRNO;
switch (error) { switch (error) {
case EACCES:
textno=ER_OPEN_AS_READONLY;
break;
case EAGAIN: case EAGAIN:
textno=ER_FILE_USED; textno=ER_FILE_USED;
break; break;
......
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