Commit 4cbe6658 authored by monty@hundin.mysql.fi's avatar monty@hundin.mysql.fi
Browse files

Symlinking of tables should not work.

Fixed error number handling bug in mysqltest.
Fixed that error number from insert delayed is reported correctly.
merged new vio code with old violite code.
parent a0b2ddd4
Loading
Loading
Loading
Loading
+20 −15
Original line number Diff line number Diff line
@@ -352,7 +352,9 @@ static void abort_not_supported_test()
static void verbose_msg(const char* fmt, ...)
{
  va_list args;
  if (!verbose) return;
  DBUG_ENTER("verbose_msg");
  if (!verbose)
    DBUG_VOID_RETURN;

  va_start(args, fmt);

@@ -360,6 +362,7 @@ static void verbose_msg(const char* fmt, ...)
  vfprintf(stderr, fmt, args);
  fprintf(stderr, "\n");
  va_end(args);
  DBUG_VOID_RETURN;
}


@@ -446,7 +449,7 @@ VAR* var_get(const char* var_name, const char** var_name_end, int raw)
  {
    const char* save_var_name = var_name, *end;
    end = (var_name_end) ? *var_name_end : 0;
    while(isalnum(*var_name) || *var_name == '_')
    while (isvar(*var_name))
    {
      if(end && var_name == end)
	break;
@@ -1522,10 +1525,12 @@ void reject_dump(const char* record_file, char* buf, int size)
  str_to_file(fn_format(reject_file, record_file,"",".reject",2), buf, size);
}

/* flags control the phased/stages of query execution to be performed 
/*
* flags control the phased/stages of query execution to be performed 
* if QUERY_SEND bit is on, the query will be sent. If QUERY_REAP is on
* the result will be read - for regular query, both bits must be on
*/

int run_query(MYSQL* mysql, struct st_query* q, int flags)
{
  MYSQL_RES* res = 0;
@@ -1576,8 +1581,6 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
    if (q->abort_on_error)
      die("At line %u: query '%s' failed: %d: %s", start_lineno, query,
	  mysql_errno(mysql), mysql_error(mysql));
      /*die("At line %u: Failed in mysql_store_result for query '%s' (%d)",
	  start_lineno, query, mysql_errno(mysql));*/
    else
    {
      for (i=0 ; q->expected_errno[i] ; i++)
@@ -1587,13 +1590,15 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
      }
      if (i)
      {
	verbose_msg("query '%s' failed with wrong errno\
 %d instead of %d...", q->query, mysql_errno(mysql), q->expected_errno[0]);
	verbose_msg("query '%s' failed with wrong errno %d instead of %d...",
		    q->query, mysql_errno(mysql), q->expected_errno[0]);
	error=1;
	goto end;
      }
      verbose_msg("query '%s' failed: %d: %s", q->query, mysql_errno(mysql),
		  mysql_error(mysql));
      /* if we do not abort on error, failure to run the query does
      /* 
	 if we do not abort on error, failure to run the query does
	 not fail the whole test case
      */
      goto end;
@@ -1758,7 +1763,7 @@ static void init_var_hash()
    die("Variable hash initialization failed");
  var_from_env("MASTER_MYPORT", "9306");
  var_from_env("SLAVE_MYPORT", "9307");
  var_from_env("MYSQL_TEST_DIR", "");
  var_from_env("MYSQL_TEST_DIR", "/tmp");
}

int main(int argc, char** argv)
+7 −1
Original line number Diff line number Diff line
@@ -1102,6 +1102,10 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info,
    share->pack.header_length;
  got_error=1;
  new_file= -1;
  sort_info->buff=0;
  sort_info->buff_length=0;
  sort_info->record=0;

  if (!(param->testflag & T_SILENT))
  {
    printf("- recovering (with keycache) MyISAM-table '%s'\n",name);
@@ -1114,7 +1118,10 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info,
  if (init_io_cache(&param->read_cache,info->dfile,
		    (uint) param->read_buffer_length,
		    READ_CACHE,share->pack.header_length,1,MYF(MY_WME)))
  {
    bzero(&info->rec_cache,sizeof(info->rec_cache));
    goto err;
  }
  if (!rep_quick)
    if (init_io_cache(&info->rec_cache,-1,(uint) param->write_buffer_length,
		      WRITE_CACHE, new_header_length, 1,
@@ -1122,7 +1129,6 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info,
      goto err;
  info->opt_flag|=WRITE_CACHE_USED;
  sort_info->start_recpos=0;
  sort_info->buff=0; sort_info->buff_length=0;
  if (!(sort_info->record=(byte*) my_malloc((uint) share->base.pack_reclength,
					   MYF(0))))
  {
+50 −26
Original line number Diff line number Diff line
@@ -38,12 +38,13 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
  register uint i,j;
  File dfile,file;
  int errpos,save_errno;
  myf create_flag;
  uint fields,length,max_key_length,packed,pointer,
       key_length,info_length,key_segs,options,min_key_length_skipp,
       base_pos,varchar_count,long_varchar_count,varchar_length,
       max_key_block_length,unique_key_parts,offset;
  ulong reclength, real_reclength,min_pack_length;
  char buff[FN_REFLEN];
  char filename[FN_REFLEN],linkname[FN_REFLEN], *linkname_ptr;
  ulong pack_reclength;
  ulonglong tot_length,max_rows;
  enum en_fieldtype type;
@@ -468,11 +469,30 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
  if (! (flags & HA_DONT_TOUCH_DATA))
    share.state.create_time= (long) time((time_t*) 0);
  
  if ((file= my_create_with_symlink(ci->index_file_name,
				    fn_format(buff,name,"",MI_NAME_IEXT,4+
					      (ci->index_file_name ? 0 : 32)),
  if (ci->index_file_name)
  {
    fn_format(filename, ci->index_file_name,"",MI_NAME_IEXT,4);
    fn_format(linkname,name, "",MI_NAME_IEXT,4);
    linkname_ptr=linkname;
    /*
      Don't create the table if the link or file exists to ensure that one
      doesn't accidently destroy another table.
    */
    create_flag=0;
  }
  else
  {
    fn_format(filename,name,"",MI_NAME_IEXT,(4+ (flags & HA_DONT_TOUCH_DATA) ?
					     32 : 0));
    linkname_ptr=0;
    /* Replace the current file */
    create_flag=MY_DELETE_OLD;
  }

  if ((file= my_create_with_symlink(linkname_ptr,
				    filename,
				    0, O_RDWR | O_TRUNC,
				    MYF(MY_WME | MY_DELETE_OLD))) < 0)
				    MYF(MY_WME | create_flag))) < 0)
    goto err;
  errpos=1;

@@ -481,8 +501,8 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
#ifdef USE_RAID
    if (share.base.raid_type)
    {
      (void) fn_format(buff,name,"",MI_NAME_DEXT,2+4);
      if ((dfile=my_raid_create(buff,0,O_RDWR | O_TRUNC,
      (void) fn_format(filename,name,"",MI_NAME_DEXT,2+4);
      if ((dfile=my_raid_create(filename,0,O_RDWR | O_TRUNC,
				share.base.raid_type,
				share.base.raid_chunks,
				share.base.raid_chunksize,
@@ -492,11 +512,23 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
    else
#endif
    {
      (void) fn_format(buff,name,"",MI_NAME_DEXT,2+4 +
		       (ci->data_file_name ? 0 : 32));
      if (ci->data_file_name)
      {
	fn_format(filename, ci->data_file_name,"",MI_NAME_DEXT,4);
	fn_format(linkname, name, "",MI_NAME_DEXT,4);
	linkname_ptr=linkname;
	create_flag=0;
      }
      else
      {
	fn_format(filename,name,"",MI_NAME_DEXT,4);
	linkname_ptr=0;
	create_flag=MY_DELETE_OLD;
      }
      if ((dfile= 
	   my_create_with_symlink(ci->data_file_name, buff, 
				  0,O_RDWR | O_TRUNC,MYF(MY_WME))) < 0)
	   my_create_with_symlink(linkname_ptr, filename,
				  0,O_RDWR | O_TRUNC,
				  MYF(MY_WME | create_flag))) < 0)
	goto err;
    }
    errpos=3;
@@ -517,14 +549,14 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
  /* Write key and keyseg definitions */
  for (i=0 ; i < share.base.keys - uniques; i++)
  {
    uint ft_segs=(keydefs[i].flag & HA_FULLTEXT) ? FT_SEGS : 0;    /* SerG */
    uint ft_segs=(keydefs[i].flag & HA_FULLTEXT) ? FT_SEGS : 0;

    if (mi_keydef_write(file, &keydefs[i]))
      goto err;
    for (j=0 ; j < keydefs[i].keysegs-ft_segs ; j++)
      if (mi_keyseg_write(file, &keydefs[i].seg[j]))
	goto err;
    for (j=0 ; j < ft_segs ; j++)                                   /* SerG */
    for (j=0 ; j < ft_segs ; j++)
    {
      MI_KEYSEG seg=ft_keysegs[j];
      seg.language= keydefs[i].seg[0].language;
@@ -605,24 +637,16 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
    VOID(my_close(dfile,MYF(0)));
    /* fall through */
  case 2:
  if (! (flags & HA_DONT_TOUCH_DATA))
  {
    /* QQ: Tnu should add a call to my_raid_delete() here */
    VOID(fn_format(buff,name,"",MI_NAME_DEXT,2+4));
    my_delete(buff,MYF(0));
    if (ci->data_file_name && strcmp(buff,ci->data_file_name))
      my_delete(ci->data_file_name,MYF(0));
  }
  if (! (flags & HA_DONT_TOUCH_DATA))
    my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_DEXT,2+4),
			   MYF(0));
    /* fall through */
  case 1:
    VOID(my_close(file,MYF(0)));
    if (! (flags & HA_DONT_TOUCH_DATA))
    {
      VOID(fn_format(buff,name,"",MI_NAME_IEXT,2+4));
      my_delete(buff,MYF(0));
      if (ci->index_file_name && strcmp(buff,ci->index_file_name))
	my_delete(ci->index_file_name,MYF(0));
    }
      my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_IEXT,2+4),
			     MYF(0));
  }
  my_free((char*) rec_per_key_part, MYF(0));
  DBUG_RETURN(my_errno=save_errno);		/* return the fatal errno */
+6 −1
Original line number Diff line number Diff line
#!/bin/sh
#
# Execute some simple basic test on MyISAM libary to check if things
# works at all.

silent="-s"
suffix=$MACH
if test -f mi_test1$MACH ; then suffix=$MACH else suffix=""; fi
mi_test1$suffix $silent
myisamchk$suffix -se test1
mi_test1$suffix $silent -N -S
+0 −4
Original line number Diff line number Diff line
@@ -183,7 +183,6 @@ static struct option long_options[] =
  {"information",      no_argument,	  0, 'i'},
  {"keys-used",        required_argument, 0, 'k'},
  {"medium-check",     no_argument,	  0, 'm'},
  {"no-symlinks",      no_argument,	  0, 'l'},
  {"quick",	       no_argument,	  0, 'q'},
  {"read-only",        no_argument,	  0, 'T'},
  {"recover",	       no_argument,	  0, 'r'},
@@ -373,9 +372,6 @@ static void get_options(register int *argc,register char ***argv)
    case 'k':
      check_param.keys_in_use= (ulonglong) strtoll(optarg,NULL,10);
      break;
    case 'l':
      check_param.opt_follow_links=0;
      break;
    case 'm':
      check_param.testflag|= T_MEDIUM;		/* Medium check */
      break;
Loading