diff options
Diffstat (limited to 'sql')
-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 |