Commit 0ebbd726 authored by unknown's avatar unknown
Browse files

Bugs#7278: Don't open a table if it contains columns with non-supported charsets

parent 30d59892
Loading
Loading
Loading
Loading
+29 −8
Original line number Diff line number Diff line
@@ -24,7 +24,8 @@

	/* Functions defined in this file */

static void frm_error(int error,TABLE *form,const char *name,int errortype);
static void frm_error(int error,TABLE *form,const char *name,
                      int errortype, int errarg);
static void fix_type_pointers(const char ***array, TYPELIB *point_to_type,
			      uint types, char **names);
static uint find_field(TABLE *form,uint start,uint length);
@@ -57,6 +58,7 @@ static byte* get_field_name(Field **buff,uint *length,
   2    Error (see frm_error)
   3    Wrong data in .frm file
   4    Error (see frm_error)
   5    Error (see frm_error: charset unavailable)
*/

int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
@@ -64,7 +66,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
{
  reg1 uint i;
  reg2 uchar *strpos;
  int	 j,error;
  int	 j,error, errarg= 0;
  uint	 rec_buff_length,n_length,int_length,records,key_parts,keys,
         interval_count,interval_parts,read_length,db_create_options;
  uint	 key_info_length, com_length;
@@ -439,7 +441,11 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
        if (!strpos[14])
          charset= &my_charset_bin;
        else if (!(charset=get_charset((uint) strpos[14], MYF(0))))
	  charset= outparam->table_charset;
        {
          error= 5; // Unknown or unavailable charset
          errarg= (int) strpos[14];
          goto err_not_open;
        }
      }
      if (!comment_length)
      {
@@ -781,7 +787,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
 err_end:					/* Here when no file */
  delete crypted;
  *root_ptr= old_root;
  frm_error(error,outparam,name,ME_ERROR+ME_WAITTANG);
  frm_error(error, outparam, name, ME_ERROR + ME_WAITTANG, errarg);
  delete outparam->file;
  outparam->file=0;				// For easyer errorchecking
  outparam->db_stat=0;
@@ -966,7 +972,8 @@ ulong make_new_entry(File file, uchar *fileinfo, TYPELIB *formnames,

	/* error message when opening a form file */

static void frm_error(int error, TABLE *form, const char *name, myf errortype)
static void frm_error(int error, TABLE *form, const char *name,
                      myf errortype, int errarg)
{
  int err_no;
  char buff[FN_REFLEN];
@@ -997,6 +1004,20 @@ static void frm_error(int error, TABLE *form, const char *name, myf errortype)
	     fn_format(buff,form->real_name,form_dev,datext,2),my_errno);
    break;
  }
  case 5:
  {
    const char *csname= get_charset_name((uint) errarg);
    char tmp[10];
    if (!csname || csname[0] =='?')
    {
      my_snprintf(tmp, sizeof(tmp), "#%d", errarg);
      csname= tmp;
    }
    my_printf_error(ER_UNKNOWN_COLLATION,
                    "Unknown collation '%s' in table '%-.64s' definition", 
                    MYF(0), csname, form->real_name);
    break;
  }
  default:				/* Better wrong error than none */
  case 4:
    my_error(ER_NOT_FORM_FILE,errortype,