Commit e7407cd8 authored by unknown's avatar unknown
Browse files

Merge xiphis.org:/home/antony/work2/p3-bug22694.1

into  xiphis.org:/home/antony/work2/p1-bug22694.2

parents b87473c3 fd1928e4
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -293,12 +293,6 @@ typedef struct st_mysql
  /* needed for embedded server - no net buffer to store the 'info' */
  char *info_buffer;
#endif
  /*
    In embedded server it points to the statement that is processed
    in the current query. We store some results directly in statement
    fields then.
  */
  struct st_mysql_stmt *current_stmt;
} MYSQL;

typedef struct st_mysql_res {
+0 −1
Original line number Diff line number Diff line
@@ -100,7 +100,6 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
  mysql->affected_rows= ~(my_ulonglong) 0;
  mysql->field_count= 0;
  net->last_errno= 0;
  mysql->current_stmt= stmt;

  thd->store_globals();				// Fix if more than one connect
  /* 
+45 −0
Original line number Diff line number Diff line
@@ -1757,4 +1757,49 @@ create table t1 (a int not null, key key_block_size=1024 (a));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=1024 (a))' at line 1
create table t1 (a int not null, key `a` key_block_size=1024 (a));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key_block_size=1024 (a))' at line 1
CREATE TABLE t1 (
c1 INT,
c2 VARCHAR(300),
KEY (c1) KEY_BLOCK_SIZE 1024,
KEY (c2) KEY_BLOCK_SIZE 8192
);
INSERT INTO t1 VALUES (10, REPEAT('a', CEIL(RAND(10) * 300))),
(11, REPEAT('b', CEIL(RAND() * 300))),
(12, REPEAT('c', CEIL(RAND() * 300))),
(13, REPEAT('d', CEIL(RAND() * 300))),
(14, REPEAT('e', CEIL(RAND() * 300))),
(15, REPEAT('f', CEIL(RAND() * 300))),
(16, REPEAT('g', CEIL(RAND() * 300))),
(17, REPEAT('h', CEIL(RAND() * 300))),
(18, REPEAT('i', CEIL(RAND() * 300))),
(19, REPEAT('j', CEIL(RAND() * 300))),
(20, REPEAT('k', CEIL(RAND() * 300))),
(21, REPEAT('l', CEIL(RAND() * 300))),
(22, REPEAT('m', CEIL(RAND() * 300))),
(23, REPEAT('n', CEIL(RAND() * 300))),
(24, REPEAT('o', CEIL(RAND() * 300))),
(25, REPEAT('p', CEIL(RAND() * 300))),
(26, REPEAT('q', CEIL(RAND() * 300))),
(27, REPEAT('r', CEIL(RAND() * 300))),
(28, REPEAT('s', CEIL(RAND() * 300))),
(29, REPEAT('t', CEIL(RAND() * 300))),
(30, REPEAT('u', CEIL(RAND() * 300))),
(31, REPEAT('v', CEIL(RAND() * 300))),
(32, REPEAT('w', CEIL(RAND() * 300))),
(33, REPEAT('x', CEIL(RAND() * 300))),
(34, REPEAT('y', CEIL(RAND() * 300))),
(35, REPEAT('z', CEIL(RAND() * 300)));
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
CHECK TABLE t1;
Table	Op	Msg_type	Msg_text
test.t1	check	status	OK
REPAIR TABLE t1;
Table	Op	Msg_type	Msg_text
test.t1	repair	status	OK
DELETE FROM t1 WHERE c1 >= 10;
CHECK TABLE t1;
Table	Op	Msg_type	Msg_text
test.t1	check	status	OK
DROP TABLE t1;
End of 5.1 tests
+43 −0
Original line number Diff line number Diff line
@@ -1054,4 +1054,47 @@ create table t1 (a int not null, key key_block_size=1024 (a));
--error 1064
create table t1 (a int not null, key `a` key_block_size=1024 (a));

#
# Bug#22119 - Changing MI_KEY_BLOCK_LENGTH makes a wrong myisamchk
#
CREATE TABLE t1 (
  c1 INT,
  c2 VARCHAR(300),
  KEY (c1) KEY_BLOCK_SIZE 1024,
  KEY (c2) KEY_BLOCK_SIZE 8192
  );
INSERT INTO t1 VALUES (10, REPEAT('a', CEIL(RAND(10) * 300))),
  (11, REPEAT('b', CEIL(RAND() * 300))),
  (12, REPEAT('c', CEIL(RAND() * 300))),
  (13, REPEAT('d', CEIL(RAND() * 300))),
  (14, REPEAT('e', CEIL(RAND() * 300))),
  (15, REPEAT('f', CEIL(RAND() * 300))),
  (16, REPEAT('g', CEIL(RAND() * 300))),
  (17, REPEAT('h', CEIL(RAND() * 300))),
  (18, REPEAT('i', CEIL(RAND() * 300))),
  (19, REPEAT('j', CEIL(RAND() * 300))),
  (20, REPEAT('k', CEIL(RAND() * 300))),
  (21, REPEAT('l', CEIL(RAND() * 300))),
  (22, REPEAT('m', CEIL(RAND() * 300))),
  (23, REPEAT('n', CEIL(RAND() * 300))),
  (24, REPEAT('o', CEIL(RAND() * 300))),
  (25, REPEAT('p', CEIL(RAND() * 300))),
  (26, REPEAT('q', CEIL(RAND() * 300))),
  (27, REPEAT('r', CEIL(RAND() * 300))),
  (28, REPEAT('s', CEIL(RAND() * 300))),
  (29, REPEAT('t', CEIL(RAND() * 300))),
  (30, REPEAT('u', CEIL(RAND() * 300))),
  (31, REPEAT('v', CEIL(RAND() * 300))),
  (32, REPEAT('w', CEIL(RAND() * 300))),
  (33, REPEAT('x', CEIL(RAND() * 300))),
  (34, REPEAT('y', CEIL(RAND() * 300))),
  (35, REPEAT('z', CEIL(RAND() * 300)));
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
CHECK TABLE t1;
REPAIR TABLE t1;
DELETE FROM t1 WHERE c1 >= 10;
CHECK TABLE t1;
DROP TABLE t1;

--echo End of 5.1 tests
+73 −17
Original line number Diff line number Diff line
@@ -251,11 +251,12 @@ static int check_k_link(MI_CHECK *param, register MI_INFO *info, uint nr)
  my_off_t next_link;
  uint block_size=(nr+1)*MI_MIN_KEY_BLOCK_LENGTH;
  ha_rows records;
  char llbuff[21],*buff;
  char llbuff[21], llbuff2[21], *buff;
  DBUG_ENTER("check_k_link");
  DBUG_PRINT("enter", ("block_size: %u", block_size));

  if (param->testflag & T_VERBOSE)
    printf("block_size %4d:",block_size);
    printf("block_size %4u:", block_size); /* purecov: tested */

  next_link=info->s->state.key_del[nr];
  records= (ha_rows) (info->state->key_file_length / block_size);
@@ -265,14 +266,46 @@ static int check_k_link(MI_CHECK *param, register MI_INFO *info, uint nr)
      DBUG_RETURN(1);
    if (param->testflag & T_VERBOSE)
      printf("%16s",llstr(next_link,llbuff));
    if (next_link > info->state->key_file_length ||
	next_link & (info->s->blocksize-1))

    /* Key blocks must lay within the key file length entirely. */
    if (next_link + block_size > info->state->key_file_length)
    {
      /* purecov: begin tested */
      mi_check_print_error(param, "Invalid key block position: %s  "
                           "key block size: %u  file_length: %s",
                           llstr(next_link, llbuff), block_size,
                           llstr(info->state->key_file_length, llbuff2));
      DBUG_RETURN(1);
      /* purecov: end */
    }

    /* Key blocks must be aligned at MI_MIN_KEY_BLOCK_LENGTH. */
    if (next_link & (MI_MIN_KEY_BLOCK_LENGTH - 1))
    {
      /* purecov: begin tested */
      mi_check_print_error(param, "Mis-aligned key block: %s  "
                           "minimum key block length: %u",
                           llstr(next_link, llbuff), MI_MIN_KEY_BLOCK_LENGTH);
      DBUG_RETURN(1);
      /* purecov: end */
    }

    /*
      Read the key block with MI_MIN_KEY_BLOCK_LENGTH to find next link.
      If the key cache block size is smaller than block_size, we can so
      avoid unecessary eviction of cache block.
    */
    if (!(buff=key_cache_read(info->s->key_cache,
                              info->s->kfile, next_link, DFLT_INIT_HITS,
                              (byte*) info->buff,
			      myisam_block_size, block_size, 1)))
                              (byte*) info->buff, MI_MIN_KEY_BLOCK_LENGTH,
                              MI_MIN_KEY_BLOCK_LENGTH, 1)))
    {
      /* purecov: begin tested */
      mi_check_print_error(param, "key cache read error for block: %s",
			   llstr(next_link,llbuff));
      DBUG_RETURN(1);
      /* purecov: end */
    }
    next_link=mi_sizekorr(buff);
    records--;
    param->key_file_blocks+=block_size;
@@ -556,17 +589,37 @@ static int chk_index_down(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
                     ha_checksum *key_checksum, uint level)
{
  char llbuff[22],llbuff2[22];
  if (page > info->state->key_file_length || (page & (info->s->blocksize -1)))
  DBUG_ENTER("chk_index_down");

  /* Key blocks must lay within the key file length entirely. */
  if (page + keyinfo->block_length > info->state->key_file_length)
  {
    /* purecov: begin tested */
    /* Give it a chance to fit in the real file size. */
    my_off_t max_length= my_seek(info->s->kfile, 0L, MY_SEEK_END, MYF(0));
    mi_check_print_error(param,"Wrong pagepointer: %s at page: %s",
                llstr(page,llbuff),llstr(page,llbuff2));

    if (page+info->s->blocksize > max_length)
    mi_check_print_error(param, "Invalid key block position: %s  "
                         "key block size: %u  file_length: %s",
                         llstr(page, llbuff), keyinfo->block_length,
                         llstr(info->state->key_file_length, llbuff2));
    if (page + keyinfo->block_length > max_length)
      goto err;
    /* Fix the remebered key file length. */
    info->state->key_file_length= (max_length &
                                  ~ (my_off_t) (info->s->blocksize-1));
                                   ~ (my_off_t) (keyinfo->block_length - 1));
    /* purecov: end */
  }

  /* Key blocks must be aligned at MI_MIN_KEY_BLOCK_LENGTH. */
  if (page & (MI_MIN_KEY_BLOCK_LENGTH - 1))
  {
    /* purecov: begin tested */
    mi_check_print_error(param, "Mis-aligned key block: %s  "
                         "minimum key block length: %u",
                         llstr(page, llbuff), MI_MIN_KEY_BLOCK_LENGTH);
    goto err;
    /* purecov: end */
  }

  if (!_mi_fetch_keypage(info,keyinfo,page, DFLT_INIT_HITS,buff,0))
  {
    mi_check_print_error(param,"Can't read key from filepos: %s",
@@ -577,9 +630,12 @@ static int chk_index_down(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
  if (chk_index(param,info,keyinfo,page,buff,keys,key_checksum,level))
    goto err;

  return 0;
  DBUG_RETURN(0);

  /* purecov: begin tested */
err:
  return 1;
  DBUG_RETURN(1);
  /* purecov: end */
}


Loading