diff options
author | Vladislav Vaintroub <wlad@montyprogram.com> | 2012-04-20 21:09:16 +0200 |
---|---|---|
committer | Vladislav Vaintroub <wlad@montyprogram.com> | 2012-04-20 21:09:16 +0200 |
commit | 97aa8e8c0ad5c921f70f021e99f1a1ed5499b47e (patch) | |
tree | ab6a8ee83e5465dda106e506a7597c79ba94efa5 | |
parent | 9997b78ae48a518e65b7c96c947e868419c679ca (diff) | |
download | mariadb-git-97aa8e8c0ad5c921f70f021e99f1a1ed5499b47e.tar.gz |
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).
-rw-r--r-- | sql/parse_file.cc | 51 | ||||
-rw-r--r-- | sql/parse_file.h | 1 | ||||
-rw-r--r-- | sql/sql_view.cc | 2 | ||||
-rw-r--r-- | sql/table.h | 17 |
4 files changed, 60 insertions, 11 deletions
diff --git a/sql/parse_file.cc b/sql/parse_file.cc index 3e1f254f610..761ab9ee10a 100644 --- a/sql/parse_file.cc +++ b/sql/parse_file.cc @@ -86,6 +86,40 @@ write_escaped_string(IO_CACHE *file, LEX_STRING *val_s) 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. @@ -124,8 +158,14 @@ write_parameter(IO_CACHE *file, uchar* base, File_option *parameter) break; } 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())) DBUG_RETURN(TRUE); break; @@ -766,6 +806,7 @@ File_parser::parse(uchar* base, MEM_ROOT *mem_root, break; } case FILE_OPTIONS_ULONGLONG: + case FILE_OPTIONS_VIEW_ALGO: if (!(eol= strchr(ptr, '\n'))) { my_error(ER_FPARSER_ERROR_IN_PARAMETER, MYF(0), @@ -774,8 +815,12 @@ File_parser::parse(uchar* base, MEM_ROOT *mem_root, } { int not_used; - *((ulonglong*)(base + parameter->offset))= - my_strtoll10(ptr, 0, ¬_used); + ulonglong val= (ulonglong)my_strtoll10(ptr, 0, ¬_used); + + if (parameter->type == FILE_OPTIONS_VIEW_ALGO) + val= view_algo_from_frm(val); + + *((ulonglong*)(base + parameter->offset))= val; } ptr= eol+1; break; diff --git a/sql/parse_file.h b/sql/parse_file.h index 2ebcd2ec987..a435a4e66fd 100644 --- a/sql/parse_file.h +++ b/sql/parse_file.h @@ -26,6 +26,7 @@ enum file_opt_type { FILE_OPTIONS_STRING, /**< String (LEX_STRING) */ FILE_OPTIONS_ESTRING, /**< Escaped string (LEX_STRING) */ 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 allocated with length 20 (19+1) */ FILE_OPTIONS_STRLIST, /**< list of escaped strings diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 8760e936d36..2c9227b46f7 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -736,7 +736,7 @@ static File_option view_parameters[]= FILE_OPTIONS_ULONGLONG}, {{ C_STRING_WITH_LEN("algorithm")}, my_offsetof(TABLE_LIST, algorithm), - FILE_OPTIONS_ULONGLONG}, + FILE_OPTIONS_VIEW_ALGO}, {{ C_STRING_WITH_LEN("definer_user")}, my_offsetof(TABLE_LIST, definer.user), FILE_OPTIONS_STRING}, diff --git a/sql/table.h b/sql/table.h index da2109809d4..6ce6c83c604 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1150,12 +1150,6 @@ typedef struct st_schema_table /* Types of derived tables. The ending part is a bitmap of phases that are 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_VIEW 1 @@ -1188,7 +1182,16 @@ typedef struct st_schema_table #define VIEW_ALGORITHM_UNDEFINED 0 #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_RIGHT 2 |