Commit d96989ca authored by unknown's avatar unknown
Browse files

Merge mysql.com:/home/svoj/devel/bk/mysql-4.1-engines

into  mysql.com:/home/svoj/devel/mysql/BUG21617/mysql-4.1-engines


myisammrg/myrg_open.c:
  Auto merged
mysql-test/r/merge.result:
  Manual merge.
mysql-test/t/merge.test:
  Manual merge.
parents 1f9b9591 7d915f01
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@
MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
{
  int save_errno,errpos=0;
  uint files=0,i,dir_length,length,key_parts;
  uint files= 0, i, dir_length, length, key_parts, min_keys= 0;
  ulonglong file_offset=0;
  char name_buff[FN_REFLEN*2],buff[FN_REFLEN],*end;
  MYRG_INFO *m_info=0;
@@ -109,6 +109,7 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
        files= 0;
      }
      m_info->reclength=isam->s->base.reclength;
      min_keys= isam->s->base.keys;
      errpos=3;
    }
    m_info->open_tables[files].table= isam;
@@ -124,6 +125,8 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
    m_info->records+= isam->state->records;
    m_info->del+= isam->state->del;
    m_info->data_file_length+= isam->state->data_file_length;
    if (min_keys > isam->s->base.keys)
      min_keys= isam->s->base.keys;
    for (i=0; i < key_parts; i++)
      m_info->rec_per_key_part[i]+= (isam->s->state.rec_per_key_part[i] /
                                     m_info->tables);
@@ -141,7 +144,7 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
    my_errno=HA_ERR_RECORD_FILE_FULL;
    goto err;
  }
  m_info->keys= files ? isam->s->base.keys : 0;
  m_info->keys= min_keys;
  bzero((char*) &m_info->by_key,sizeof(m_info->by_key));

  /* this works ok if the table list is empty */
+2 −0
Original line number Diff line number Diff line
@@ -51,6 +51,8 @@ int _myrg_init_queue(MYRG_INFO *info,int inx,enum ha_rkey_function search_flag)
	error=my_errno;
    }
  }
  else
    my_errno= error= HA_ERR_WRONG_INDEX;
  return error;
}

+6 −0
Original line number Diff line number Diff line
@@ -766,6 +766,12 @@ Table Op Msg_type Msg_text
test.t1	check	status	OK
test.t2	check	status	OK
drop table t1, t2, t3;
CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES(2),(1);
CREATE TABLE t2(a INT, KEY(a)) ENGINE=MERGE UNION=(t1);
SELECT * FROM t2 WHERE a=2;
ERROR HY000: Got error 124 from storage engine
DROP TABLE t1, t2;
CREATE TABLE t1(a INT) ENGINE=MEMORY;
CREATE TABLE t2(a INT) ENGINE=MERGE UNION=(t1);
SELECT * FROM t2;
+11 −0
Original line number Diff line number Diff line
@@ -376,6 +376,17 @@ select * from t3;
check table t1, t2;
drop table t1, t2, t3;

#
# BUG#21617 - crash when selecting from merge table with inconsistent
# indexes
#
CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES(2),(1);
CREATE TABLE t2(a INT, KEY(a)) ENGINE=MERGE UNION=(t1);
--error 1030
SELECT * FROM t2 WHERE a=2;
DROP TABLE t1, t2;

#
# BUG#10974 - No error message if merge table based on union of innodb,
# memory
+19 −29
Original line number Diff line number Diff line
@@ -166,14 +166,9 @@ void queue_insert(register QUEUE *queue, byte *element)
{
  reg2 uint idx, next;
  int cmp;

#ifndef DBUG_OFF
  if (queue->elements < queue->max_elements)
#endif
  {
  DBUG_ASSERT(queue->elements < queue->max_elements);
  queue->root[0]= element;
  idx= ++queue->elements;

  /* max_at_top swaps the comparison if we want to order by desc */
  while ((cmp= queue->compare(queue->first_cmp_arg,
                              element + queue->offset_to_key,
@@ -185,7 +180,6 @@ void queue_insert(register QUEUE *queue, byte *element)
    idx= next;
  }
  queue->root[idx]= element;
  }
}

	/* Remove item from queue */
@@ -193,16 +187,12 @@ void queue_insert(register QUEUE *queue, byte *element)

byte *queue_remove(register QUEUE *queue, uint idx)
{
#ifndef DBUG_OFF
  if (idx >= queue->max_elements)
    return 0;
#endif
  {
    byte *element=queue->root[++idx];	/* Intern index starts from 1 */
  byte *element;
  DBUG_ASSERT(idx < queue->max_elements);
  element= queue->root[++idx];  /* Intern index starts from 1 */
  queue->root[idx]= queue->root[queue->elements--];
  _downheap(queue, idx);
  return element;
  }
}

	/* Fix when element on top has been replaced */