Commit 97aa8e8c authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

LPBUG#983285 - incompatibility in frm in case of VIEWs with non-default ALGORITHM option.

As part of derived tables redesign, values for VIEW_ALGORITHM_MERGE and VIEW_ALGORITHM_TMPTABLE have changed from (former values 1 rsp 2 , new values 5 rsp 9).

This lead to the problem that views, created with version 5.2  or earlier would not work in all situations  (e.g "SHOW CREATE VIEW"), or with mysqldump.

The fix is to restore backward compatibility for the from file, and convert algorithm={1,2} in the frm to {5,9} when reading .frm from disk, and store backward compatible values when writing from to disk. 

Also allow processing correct processing for "invalid" .frms created with MariaDB 5.3/5.5 GA releases (where algorithm stored in memory matched the one stored in frm).
parent 9997b78a
...@@ -86,6 +86,40 @@ write_escaped_string(IO_CACHE *file, LEX_STRING *val_s) ...@@ -86,6 +86,40 @@ write_escaped_string(IO_CACHE *file, LEX_STRING *val_s)
return FALSE; return FALSE;
} }
static ulonglong view_algo_to_frm(ulonglong val)
{
switch(val)
{
case VIEW_ALGORITHM_UNDEFINED:
return VIEW_ALGORITHM_UNDEFINED_FRM;
case VIEW_ALGORITHM_MERGE:
return VIEW_ALGORITHM_MERGE_FRM;
case VIEW_ALGORITHM_TMPTABLE:
return VIEW_ALGORITHM_TMPTABLE_FRM;
}
DBUG_ASSERT(0); /* Should never happen */
return VIEW_ALGORITHM_UNDEFINED;
}
static ulonglong view_algo_from_frm(ulonglong val)
{
switch(val)
{
case VIEW_ALGORITHM_UNDEFINED_FRM:
return VIEW_ALGORITHM_UNDEFINED;
case VIEW_ALGORITHM_MERGE_FRM:
return VIEW_ALGORITHM_MERGE;
case VIEW_ALGORITHM_TMPTABLE_FRM:
return VIEW_ALGORITHM_TMPTABLE;
}
/*
Early versions of MariaDB 5.2/5.3 had identical in-memory and frm values
Return input value.
*/
return val;
}
/** /**
Write parameter value to IO_CACHE. Write parameter value to IO_CACHE.
...@@ -124,8 +158,14 @@ write_parameter(IO_CACHE *file, uchar* base, File_option *parameter) ...@@ -124,8 +158,14 @@ write_parameter(IO_CACHE *file, uchar* base, File_option *parameter)
break; break;
} }
case FILE_OPTIONS_ULONGLONG: case FILE_OPTIONS_ULONGLONG:
case FILE_OPTIONS_VIEW_ALGO:
{ {
num.set(*((ulonglong *)(base + parameter->offset)), &my_charset_bin); ulonglong val= *(ulonglong *)(base + parameter->offset);
if (parameter->type == FILE_OPTIONS_VIEW_ALGO)
val= view_algo_to_frm(val);
num.set(val, &my_charset_bin);
if (my_b_append(file, (const uchar *)num.ptr(), num.length())) if (my_b_append(file, (const uchar *)num.ptr(), num.length()))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
break; break;
...@@ -766,6 +806,7 @@ File_parser::parse(uchar* base, MEM_ROOT *mem_root, ...@@ -766,6 +806,7 @@ File_parser::parse(uchar* base, MEM_ROOT *mem_root,
break; break;
} }
case FILE_OPTIONS_ULONGLONG: case FILE_OPTIONS_ULONGLONG:
case FILE_OPTIONS_VIEW_ALGO:
if (!(eol= strchr(ptr, '\n'))) if (!(eol= strchr(ptr, '\n')))
{ {
my_error(ER_FPARSER_ERROR_IN_PARAMETER, MYF(0), my_error(ER_FPARSER_ERROR_IN_PARAMETER, MYF(0),
...@@ -774,8 +815,12 @@ File_parser::parse(uchar* base, MEM_ROOT *mem_root, ...@@ -774,8 +815,12 @@ File_parser::parse(uchar* base, MEM_ROOT *mem_root,
} }
{ {
int not_used; int not_used;
*((ulonglong*)(base + parameter->offset))= ulonglong val= (ulonglong)my_strtoll10(ptr, 0, &not_used);
my_strtoll10(ptr, 0, &not_used);
if (parameter->type == FILE_OPTIONS_VIEW_ALGO)
val= view_algo_from_frm(val);
*((ulonglong*)(base + parameter->offset))= val;
} }
ptr= eol+1; ptr= eol+1;
break; break;
......
...@@ -26,6 +26,7 @@ enum file_opt_type { ...@@ -26,6 +26,7 @@ enum file_opt_type {
FILE_OPTIONS_STRING, /**< String (LEX_STRING) */ FILE_OPTIONS_STRING, /**< String (LEX_STRING) */
FILE_OPTIONS_ESTRING, /**< Escaped string (LEX_STRING) */ FILE_OPTIONS_ESTRING, /**< Escaped string (LEX_STRING) */
FILE_OPTIONS_ULONGLONG, /**< ulonglong parameter (ulonglong) */ FILE_OPTIONS_ULONGLONG, /**< ulonglong parameter (ulonglong) */
FILE_OPTIONS_VIEW_ALGO, /**< Similar to longlong, but needs conversion */
FILE_OPTIONS_TIMESTAMP, /**< timestamp (LEX_STRING have to be FILE_OPTIONS_TIMESTAMP, /**< timestamp (LEX_STRING have to be
allocated with length 20 (19+1) */ allocated with length 20 (19+1) */
FILE_OPTIONS_STRLIST, /**< list of escaped strings FILE_OPTIONS_STRLIST, /**< list of escaped strings
......
...@@ -736,7 +736,7 @@ static File_option view_parameters[]= ...@@ -736,7 +736,7 @@ static File_option view_parameters[]=
FILE_OPTIONS_ULONGLONG}, FILE_OPTIONS_ULONGLONG},
{{ C_STRING_WITH_LEN("algorithm")}, {{ C_STRING_WITH_LEN("algorithm")},
my_offsetof(TABLE_LIST, algorithm), my_offsetof(TABLE_LIST, algorithm),
FILE_OPTIONS_ULONGLONG}, FILE_OPTIONS_VIEW_ALGO},
{{ C_STRING_WITH_LEN("definer_user")}, {{ C_STRING_WITH_LEN("definer_user")},
my_offsetof(TABLE_LIST, definer.user), my_offsetof(TABLE_LIST, definer.user),
FILE_OPTIONS_STRING}, FILE_OPTIONS_STRING},
......
...@@ -1150,12 +1150,6 @@ typedef struct st_schema_table ...@@ -1150,12 +1150,6 @@ typedef struct st_schema_table
/* /*
Types of derived tables. The ending part is a bitmap of phases that are Types of derived tables. The ending part is a bitmap of phases that are
applicable to a derived table of the type. applicable to a derived table of the type.
* /
#define VIEW_ALGORITHM_UNDEFINED 0
#define VIEW_ALGORITHM_MERGE 1 + DT_COMMON + DT_MERGE
#define DERIVED_ALGORITHM_MERGE 2 + DT_COMMON + DT_MERGE
#define VIEW_ALGORITHM_TMPTABLE 3 + DT_COMMON + DT_MATERIALIZE
#define DERIVED_ALGORITHM_MATERIALIZE 4 + DT_COMMON + DT_MATERIALIZE
*/ */
#define DTYPE_ALGORITHM_UNDEFINED 0 #define DTYPE_ALGORITHM_UNDEFINED 0
#define DTYPE_VIEW 1 #define DTYPE_VIEW 1
...@@ -1188,7 +1182,16 @@ typedef struct st_schema_table ...@@ -1188,7 +1182,16 @@ typedef struct st_schema_table
#define VIEW_ALGORITHM_UNDEFINED 0 #define VIEW_ALGORITHM_UNDEFINED 0
#define VIEW_ALGORITHM_MERGE (DTYPE_VIEW | DTYPE_MERGE) #define VIEW_ALGORITHM_MERGE (DTYPE_VIEW | DTYPE_MERGE)
#define VIEW_ALGORITHM_TMPTABLE (DTYPE_VIEW + DTYPE_MATERIALIZE ) #define VIEW_ALGORITHM_TMPTABLE (DTYPE_VIEW | DTYPE_MATERIALIZE)
/*
View algorithm values as stored in the FRM. Values differ from in-memory
representation for backward compatibility.
*/
#define VIEW_ALGORITHM_UNDEFINED_FRM 0
#define VIEW_ALGORITHM_MERGE_FRM 1
#define VIEW_ALGORITHM_TMPTABLE_FRM 2
#define JOIN_TYPE_LEFT 1 #define JOIN_TYPE_LEFT 1
#define JOIN_TYPE_RIGHT 2 #define JOIN_TYPE_RIGHT 2
......
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