No "Phase 0" please, renumber all phases to start from 1.
Took opportunity to make adding/changing phases to be lest conflicts in merge
https://github.com/openquery/mariadb-server/commit/25872e2802a4ae32d4f18132d...
I don't know whether it's a good idea.
It means that, for example "Running 'mysql_fix_privilege_tables'..." won't always be Phase 3/3, but depending on command-line options it might be a Phase 2 or 1 (well, may be mysql_fix_privilege_tables phase cannot - but there certainly are phases that are run conditionally).
I personally don't know how bad it is, perhaps it's fine to renumber phases dynamically when some phases are skipped. So I have no opinion. I'm just saying that phases might be renumbered dynamically after your patch.
Well consistent phase numbering to activity is a good goal. So is knowing why phases that just don't occur. So is having a total phases that is actually reached. So produce output for every phase, even if it just says we're skipping it: https://github.com/MariaDB/server/commit/808608cb3f4e10ba81679c94b2a299a32cf...
I believe I meant these three variants:
--upgrade-views = no don't change view frm's --upgrade-views = yes upgrade view frms adding mariadb_version field and if is_mysql() returned true also toggle the view algorithm --upgrade-views = from_mysql always toggle the view algorithm, even if is_mysql() returned false.
Right is_mysql is in mysql_upgrade and --upgrade-view is mysqlcheck. Always exclusing if there is a mariadb-version in in the frm I assume.
The last case is useful if a user has migrated from MySQL some time ago, so it's a mariadb-to-mariadb upgrade but views stay wrong from older mysql-to-mariadb upgrade.
Added: https://github.com/MariaDB/server/commit/97e0aeaf72cde117b8d9551f68d407fa13a... I'm almost thinking mysqlcheck should default to --upgrade-views=yes? At least it will do a checksum but otherwise won't rewrite a view unless there is missing mariadb-version note mysql_upgrade: is_mysql detected run with --upgrade_views=from_mysql --upgrade-system-tables - upgrade_views not run otherwise --upgrade_views=yes to get old views upgraded (and checksum checked). https://github.com/MariaDB/server/commit/4987080ddb42abf1a9111bd6a79e7bed746...
case OPT_MYSQL_PROTOCOL: opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, opt->name); @@ -595,7 +605,15 @@ static int process_all_tables_in_db(char for (end = tables + 1; (row = mysql_fetch_row(res)) ;) { if ((num_columns == 2) && (strcmp(row[1], "VIEW") == 0)) - continue; + { + if (!opt_mysql_upgrade) + continue; + } + else + { + if (opt_mysql_upgrade) + continue;
Eh? If --mysql-upgrade is specified you skip all tables and only upgrade views? Then the option should absolutely be called --fix-view-algorithm
Has been renamed to --upgrade-views and it doesn't skip all tables. This is done with --skip-fix-tables https://github.com/MariaDB/server/commit/fc277cd4ba6c506a6f6c71e04c462b24a3f...
--- a/mysql-test/r/view.result 2014-12-21 18:23:28 +0000 +++ b/mysql-test/r/view.result 2015-02-09 01:48:28 +0000 ... +check view v1,v2,v3,v4,v5 FOR UPGRADE; +Table Op Msg_type Msg_text +test.v1 check Note view 'test.v1' has no field mariadb server in its .frm file +test.v1 check status needs repair +test.v2 check Note view 'test.v2' has no field mariadb server in its .frm file +test.v2 check status needs repair +test.v3 check Note view 'test.v3' has no field mariadb server in its .frm file +test.v3 check status needs repair +test.v4 check note View text checksum failed +test.v5 check status OK +repair view v1,v2,v3,v4,v5 FROM MYSQL;
where's the test for "repair view" without FROM MYSQL ?
done: https://github.com/MariaDB/server/commit/c584058f8f227a2004f9fdf6fd0897e11fd...
Please add also a test to show how REPAIR VIEW is replicated. Doesn't have to be a replication test, really. I'd say that "show binlog events" after the REPAIR VIEW should suffice. Use ----
done: https://github.com/MariaDB/server/commit/c584058f8f227a2004f9fdf6fd0897e11fd...
=== modified file 'sql/sql_table.cc' --- a/sql/sql_table.cc 2015-01-14 11:10:13 +0000 +++ b/sql/sql_table.cc 2015-02-09 01:48:28 +0000 @@ -28,7 +28,7 @@ #include "sql_base.h" // open_table_uncached, lock_table_names #include "lock.h" // mysql_unlock_tables #include "strfunc.h" // find_type2, find_set -#include "sql_view.h" // view_checksum +#include "sql_view.h" // view_check
You've modified only the comment, not the actual C++ code that uses view_checksum in this file.
So, either the comment is wrong (view_checksum is not used in this file) and should be removed, or the whole #include is unnecessary.
it was unnecessary - removed https://github.com/MariaDB/server/commit/7229b19c67d12ff579c64f1184e951015aa...
=== modified file 'sql/sql_view.cc' --- a/sql/sql_view.cc 2014-12-21 18:23:28 +0000 +++ b/sql/sql_view.cc 2015-02-09 01:48:28 +0000 @@ -729,6 +729,26 @@ err: }
+static void make_view_filename(LEX_STRING *dir, char *dir_buff, + size_t dir_buff_len, + LEX_STRING *path, char *path_buff, + size_t path_buff_len, + LEX_STRING *file, + TABLE_LIST *view) +{ + /* print file name */ + dir->length= build_table_filename(dir_buff, dir_buff_len - 1, + view->db, "", "", 0); + dir->str= dir_buff; + + path->length= build_table_filename(path_buff, path_buff_len - 1, + view->db, view->table_name, reg_ext, 0); + path->str= path_buff; + + file->str= path->str + dir->length; + file->length= path->length - dir->length; +} + /* number of required parameters for making view */ static const int required_view_parameters= 15;
@@ -791,6 +811,81 @@ static File_option view_parameters[]= static LEX_STRING view_file_type[]= {{(char*) STRING_WITH_LEN("VIEW") }};
+int (THD *thd, TABLE_LIST *view, bool wrong_checksum, + bool swap_alg) +{ + char dir_buff[FN_REFLEN + 1], path_buff[FN_REFLEN + 1]; + LEX_STRING dir, file, path; + DBUG_ENTER("mariadb_fix_view"); + + if (view->algorithm == VIEW_ALGORITHM_UNDEFINED && + !wrong_checksum && view->mariadb_version) + DBUG_RETURN(HA_ADMIN_OK);
Eh? Why do you care what view->algorithm is? It doesn't matter whether it's undefined, merge, or temptable - if mariadb_version is set, the algorithm is always correct.
corrected: https://github.com/MariaDB/server/commit/29721d7d5f85fe323d70f1856aa1e5294e1...
+ + if (!(parser= sql_parse_prepare(&path, thd->mem_root, 0))) + DBUG_RETURN(HA_ADMIN_INTERNAL_ERROR); + + if (!parser->ok() || !is_equal(&view_type, parser->type())) + DBUG_RETURN(HA_ADMIN_INVALID); + } + + if (swap_alg && view->algorithm != VIEW_ALGORITHM_UNDEFINED)
only if mariadb_version is not set.
Already covered earlier in the function
+int view_repair(THD *thd, TABLE_LIST *view, HA_CHECK_OPT *check_opt) +{ + DBUG_ENTER("view_repair"); + bool swap_alg= + ((check_opt->sql_flags & TT_FROM_MYSQL) && + (!view->mariadb_version)); + bool wrong_checksum= view_checksum(thd, view); + if (wrong_checksum || swap_alg) + { + DBUG_RETURN(mariadb_fix_view(thd, view, wrong_checksum, swap_alg));
First, don't call functions from DBUG_RETURN, this produces weird debug traces and somebody will have to fix this later. Always
fixed. like below. (https://github.com/MariaDB/server/commit/8a827d530a67d40332668d31683a45f5839...)
int res= mariadb_fix_view(thd, view, wrong_checksum, swap_alg); DBUG_RETURN(res);
Alternatively, feel free to fix dbug macros to support function calls in DBUG_RETURN() :)
I was too lazy. sorry.
Second, REPAIR VIEW viewname - without FROM MYSQL - should work too, it should add mariadb_version field without changing the algorithm.
ok. Done - https://github.com/MariaDB/server/commit/76c18f7e76dff6f5c5f8986e0480074a310...
=== modified file 'sql/sql_yacc.yy' --- a/sql/sql_yacc.yy 2014-11-08 18:54:42 +0000 +++ b/sql/sql_yacc.yy 2015-02-09 01:48:28 +0000 @@ -1145,6 +1145,7 @@ bool my_yyoverflow(short **a, YYSTYPE ** %token MULTIPOINT %token MULTIPOLYGON %token MUTEX_SYM +%token MYSQL_SYM %token MYSQL_ERRNO_SYM %token NAMES_SYM /* SQL-2003-N */ %token NAME_SYM /* SQL-2003-N */ @@ -7191,11 +7192,16 @@ opt_checksum_type: ;
repair: - REPAIR opt_no_write_to_binlog table_or_tables + REPAIR opt_no_write_to_binlog table_or_view { LEX *lex=Lex; lex->sql_command = SQLCOM_REPAIR; lex->no_write_to_binlog= $2; + if (lex->no_write_to_binlog && lex->only_view) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT;
Why? REPAIR NO_WRITE_TO_BINLOG VIEW makes perfect sense to me, why did you want to disallow it?
corrected: https://github.com/MariaDB/server/commit/28b173134ee1634a2489d3cef6faf2f3ea1... -- -- Daniel Black, Engineer @ Open Query (http://openquery.com.au) Remote expertise & maintenance for MySQL/MariaDB server environments.