From 6f17e233bf7f4de20dda8fb31f63aa52452c4e0a Mon Sep 17 00:00:00 2001
From: Sergei Golubchik <serg@mariadb.org>
Date: Tue, 28 Apr 2015 21:24:32 +0200
Subject: [PATCH] post-merge fixes

---
 client/client_priv.h                   |   1 -
 client/mysql_upgrade.c                 |  36 ++++--
 client/mysqlcheck.c                    | 164 ++++++++++++-------------
 mysql-test/r/log_tables_upgrade.result |   7 +-
 mysql-test/r/mysql_upgrade.result      |  21 ++--
 mysql-test/r/mysql_upgrade_ssl.result  |   7 +-
 mysql-test/r/mysql_upgrade_view.result |  37 +++++-
 mysql-test/t/mysql_upgrade_view.test   |  46 +++----
 sql/sql_admin.cc                       |  11 +-
 sql/sql_view.cc                        |  46 ++-----
 sql/sql_yacc.yy                        |  14 +--
 11 files changed, 193 insertions(+), 197 deletions(-)

diff --git a/client/client_priv.h b/client/client_priv.h
index a66c3883654..e206804d057 100644
--- a/client/client_priv.h
+++ b/client/client_priv.h
@@ -79,7 +79,6 @@ enum options_client
   OPT_SLAP_COMMIT,
   OPT_SLAP_DETACH,
   OPT_SLAP_NO_DROP,
-  OPT_UPGRADE_VIEWS,
   OPT_MYSQL_REPLACE_INTO, OPT_BASE64_OUTPUT_MODE, OPT_SERVER_ID,
   OPT_FIX_TABLE_NAMES, OPT_FIX_DB_NAMES, OPT_SSL_VERIFY_SERVER_CERT,
   OPT_AUTO_VERTICAL_OUTPUT,
diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c
index 97e2ad92239..d513d5d852d 100644
--- a/client/mysql_upgrade.c
+++ b/client/mysql_upgrade.c
@@ -741,6 +741,12 @@ static void print_conn_args(const char *tool_name)
 static int run_mysqlcheck_upgrade(void)
 {
   int retch;
+  if (opt_systables_only)
+  {
+    verbose("Phase %d/%d: Checking and upgrading tables... Skipped",
+            phase++, phases_total);
+    return 0;
+  }
   verbose("Phase %d/%d: Checking and upgrading tables", phase++, phases_total);
   print_conn_args("mysqlcheck");
   retch= run_tool(mysqlcheck_path,
@@ -755,8 +761,6 @@ static int run_mysqlcheck_upgrade(void)
                   opt_write_binlog ? "--write-binlog" : "--skip-write-binlog",
                   "2>&1",
                   NULL);
-  if (retch || opt_systables_only)
-    verbose("Phase %d/%d: Skipping 'mysql_fix_privilege_tables'... not needed", phase++, phases_total);
   return retch;
 }
 
@@ -784,15 +788,15 @@ static my_bool is_mysql()
 
 static int run_mysqlcheck_views(void)
 {
-  const char *upgrade_views="--upgrade-views=YES";
+  const char *upgrade_views="--process-views=YES";
   if (is_mysql())
   {
-    upgrade_views="--upgrade-views=FROM_MYSQL";
+    upgrade_views="--process-views=UPGRADE_FROM_MYSQL";
     verbose("Phase %d/%d: Fixing views from mysql", phase++, phases_total);
   }
   else if (opt_systables_only)
   {
-    verbose("Phase %d/%d: Fixing views - skipped - not required", phase++, phases_total);
+    verbose("Phase %d/%d: Fixing views... Skipped", phase++, phases_total);
     return 0;
   }
   else
@@ -803,9 +807,9 @@ static int run_mysqlcheck_views(void)
                   NULL, /* Send output from mysqlcheck directly to screen */
                   "--no-defaults",
                   ds_args.str,
-                  "--all-databases",
+                  "--all-databases", "--repair",
                   upgrade_views,
-                  "--skip-fix-tables",
+                  "--skip-process-tables",
                   opt_verbose ? "--verbose": "",
                   opt_silent ? "--silent": "",
                   opt_write_binlog ? "--write-binlog" : "--skip-write-binlog",
@@ -815,7 +819,14 @@ static int run_mysqlcheck_views(void)
 
 static int run_mysqlcheck_fixnames(void)
 {
-  verbose("Phase %d/%d: Fixing table and database names", phase++, phases_total);
+  if (opt_systables_only)
+  {
+    verbose("Phase %d/%d: Fixing table and database names ... Skipped",
+            phase++, phases_total);
+    return 0;
+  }
+  verbose("Phase %d/%d: Fixing table and database names",
+          phase++, phases_total);
   print_conn_args("mysqlcheck");
   return run_tool(mysqlcheck_path,
                   NULL, /* Send output from mysqlcheck directly to screen */
@@ -896,7 +907,8 @@ static int run_sql_fix_privilege_tables(void)
   if (init_dynamic_string(&ds_result, "", 512, 512))
     die("Out of memory");
 
-  verbose("Phase %d/%d: Running 'mysql_fix_privilege_tables'...", phase++, phases_total);
+  verbose("Phase %d/%d: Running 'mysql_fix_privilege_tables'",
+          phase++, phases_total);
   run_query(mysql_fix_privilege_tables,
             &ds_result, /* Collect result */
             TRUE);
@@ -1058,10 +1070,8 @@ int main(int argc, char **argv)
   /*
     Run "mysqlcheck" and "mysql_fix_privilege_tables.sql"
   */
-  if ((!opt_systables_only &&
-       (run_mysqlcheck_views() ||
-        run_mysqlcheck_fixnames() || run_mysqlcheck_upgrade())) ||
-      run_sql_fix_privilege_tables())
+  if (run_mysqlcheck_views() || run_mysqlcheck_fixnames() ||
+      run_mysqlcheck_upgrade() || run_sql_fix_privilege_tables())
   {
     /*
       The upgrade failed to complete in some way or another,
diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c
index 43c7ff0d8a1..021b89ed4b9 100644
--- a/client/mysqlcheck.c
+++ b/client/mysqlcheck.c
@@ -43,7 +43,7 @@ static my_bool opt_alldbs = 0, opt_check_only_changed = 0, opt_extended = 0,
                opt_silent = 0, opt_auto_repair = 0, ignore_errors = 0,
                tty_password= 0, opt_frm= 0, debug_info_flag= 0, debug_check_flag= 0,
                opt_fix_table_names= 0, opt_fix_db_names= 0, opt_upgrade= 0,
-               opt_fix_tables= 1;
+               opt_do_tables= 1;
 static my_bool opt_write_binlog= 1, opt_flush_tables= 0;
 static uint verbose = 0, opt_mysql_port=0;
 static int my_end_arg;
@@ -56,21 +56,17 @@ DYNAMIC_ARRAY tables4repair, tables4rebuild, alter_table_cmds;
 static char *shared_memory_base_name=0;
 static uint opt_protocol=0;
 
-enum operations { DO_CHECK=1, DO_REPAIR, DO_ANALYZE, DO_OPTIMIZE, DO_UPGRADE };
+enum operations { DO_CHECK=1, DO_REPAIR, DO_ANALYZE, DO_OPTIMIZE, DO_FIX_NAMES };
+const char *operation_name[]=
+{
+  "???", "check", "repair", "analyze", "optimize", "fix names"
+};
 
-typedef enum {
-  UPGRADE_VIEWS_NO=0,
-  UPGRADE_VIEWS_YES=1,
-  UPGRADE_VIEWS_FROM_MYSQL=2,
-  UPGRADE_VIEWS_COUNT
-} enum_upgrade_views;
-const char *upgrade_views_opts[]=
-{"NO", "YES", "FROM_MYSQL", NullS};
-TYPELIB upgrade_views_typelib=
-  { array_elements(upgrade_views_opts) - 1, "",
-    upgrade_views_opts, NULL };
-static enum_upgrade_views opt_upgrade_views= UPGRADE_VIEWS_NO;
-static char *opt_upgrade_views_str= NullS;
+typedef enum { DO_VIEWS_NO, DO_VIEWS_YES, DO_VIEWS_FROM_MYSQL } enum_do_views;
+const char *do_views_opts[]= {"NO", "YES", "UPGRADE_FROM_MYSQL", NullS};
+TYPELIB do_views_typelib= { array_elements(do_views_opts) - 1, "",
+    do_views_opts, NULL };
+static ulong opt_do_views= DO_VIEWS_NO;
 
 static struct my_option my_long_options[] =
 {
@@ -211,15 +207,14 @@ static struct my_option my_long_options[] =
    NO_ARG, 0, 0, 0, 0, 0, 0},
   {"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
    NO_ARG, 0, 0, 0, 0, 0, 0},
-  {"upgrade-views", OPT_UPGRADE_VIEWS,
-   "Repairs/Upgrades views. 'No' (default) doesn't do anything to views. "
-   "'Yes' repairs the checksum and adds a MariaDB version to the frm table defination (if missing)."
-   "Using 'from_mysql' will, when upgrading from MySQL, and ensure the view algorithms are the"
-   "same as what they where previously.",
-   &opt_upgrade_views_str, &opt_upgrade_views_str, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
-  {"fix-tables", 'Y',
-   "Fix tables. Usually the default however mysql_upgrade will run with --skip-fix-tables.",
-   &opt_fix_tables, &opt_fix_tables, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
+  {"process-views", 0,
+   "Perform the requested operation (check or repair) on views. "
+   "One of: NO, YES (correct the checksum, if necessary, add the "
+   "mariadb-version field), UPGRADE_FROM_MYSQL (same as YES and toggle "
+   "the algorithm MERGE<->TEMPTABLE.", &opt_do_views, &opt_do_views,
+   &do_views_typelib, GET_ENUM, OPT_ARG, 0, 0, 0, 0, 0, 0},
+  {"process-tables", 0, "Perform the requested operation on tables.",
+   &opt_do_tables, &opt_do_tables, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
   {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
 };
 
@@ -236,7 +231,7 @@ static int process_selected_tables(char *db, char **table_names, int tables);
 static int process_all_tables_in_db(char *database);
 static int process_one_db(char *database);
 static int use_db(char *database);
-static int handle_request_for_tables(char *tables, uint length, my_bool view);
+static int handle_request_for_tables(char *tables, size_t length, my_bool view);
 static int dbConnect(char *host, char *user,char *passwd);
 static void dbDisconnect(char *host);
 static void DBerror(MYSQL *mysql, const char *when);
@@ -311,11 +306,11 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
     what_to_do = DO_OPTIMIZE;
     break;
   case OPT_FIX_DB_NAMES:
-    what_to_do= DO_UPGRADE;
+    what_to_do= DO_FIX_NAMES;
     opt_databases= 1;
     break;
   case OPT_FIX_TABLE_NAMES:
-    what_to_do= DO_UPGRADE;
+    what_to_do= DO_FIX_NAMES;
     break;
   case 'p':
     if (argument == disabled_my_option)
@@ -359,15 +354,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
   case 'V':
     print_version(); exit(0);
     break;
-  case OPT_UPGRADE_VIEWS:
-    if (argument == NULL)
-      opt_upgrade_views= UPGRADE_VIEWS_NO;
-    else
-    {
-      opt_upgrade_views= (enum_upgrade_views)
-        (find_type_or_exit(argument, &upgrade_views_typelib, opt->name)-1);
-    }
-    break;
   case OPT_MYSQL_PROTOCOL:
     opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib,
                                     opt->name);
@@ -376,7 +362,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
 
   if (orig_what_to_do && (what_to_do != orig_what_to_do))
   {
-    fprintf(stderr, "Error:  %s doesn't support multiple contradicting commands.\n",
+    fprintf(stderr, "Error: %s doesn't support multiple contradicting commands.\n",
             my_progname);
     DBUG_RETURN(1);
   }
@@ -398,23 +384,12 @@ static int get_options(int *argc, char ***argv)
   if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
     exit(ho_error);
 
-  if (what_to_do==DO_REPAIR && !(opt_upgrade_views || opt_fix_tables))
+  if (what_to_do == DO_REPAIR && !opt_do_views && !opt_do_tables)
   {
-    fprintf(stderr, "Error:  %s doesn't support repair command without either upgrade-views or fix-tables specified.\n",
-            my_progname);
+    fprintf(stderr, "Error: Nothing to repair when both "
+            "--process-tables=NO and --process-views=NO\n");
     exit(1);
   }
-  if (opt_upgrade_views && what_to_do!=DO_REPAIR)
-  {
-    if (!what_to_do)
-      what_to_do= DO_REPAIR;
-    else
-    {
-      fprintf(stderr, "Error:  %s doesn't support non-repair command with option upgrade-views.\n",
-              my_progname);
-      exit(1);
-    }
-  }
   if (!what_to_do)
   {
     size_t pnlen= strlen(my_progname);
@@ -431,6 +406,13 @@ static int get_options(int *argc, char ***argv)
       what_to_do = DO_CHECK;
   }
 
+  if (opt_do_views && what_to_do != DO_REPAIR && what_to_do != DO_CHECK)
+  {
+    fprintf(stderr, "Error: %s doesn't support %s for views.\n",
+            my_progname, operation_name[what_to_do]);
+    exit(1);
+  }
+
   /*
     If there's no --default-character-set option given with
     --fix-table-name or --fix-db-name set the default character set to "utf8".
@@ -516,19 +498,15 @@ static int process_databases(char **db_names)
 
 
 /* returns: -1 for error, 1 for view, 0 for table */
-static int is_view(const char *table, uint length)
+static int is_view(const char *table)
 {
-  char *query, *ptr;
+  char query[1024];
   MYSQL_RES *res;
   MYSQL_FIELD *field;
   int view;
   DBUG_ENTER("is_view");
 
-  if (!(query =(char *) my_malloc((sizeof(char)*(length+110)), MYF(MY_WME))))
-    DBUG_RETURN(-1);
-  ptr= strmov(query, "SHOW CREATE TABLE `");
-  ptr= strxmov(ptr, table, NullS);
-  ptr= strxmov(ptr, "`", NullS);
+  my_snprintf(query, sizeof(query), "SHOW CREATE TABLE %`s", table);
   if (mysql_query(sock, query))
   {
     fprintf(stderr, "Failed to %s\n", query);
@@ -538,9 +516,8 @@ static int is_view(const char *table, uint length)
   }
   res= mysql_store_result(sock);
   field= mysql_fetch_field(res);
-  view= (strcmp(field->name,"View")==0) ? 1 : 0;
+  view= (strcmp(field->name,"View") == 0) ? 1 : 0;
   mysql_free_result(res);
-  my_free(query);
 
   DBUG_RETURN(view);
 }
@@ -554,7 +531,7 @@ static int process_selected_tables(char *db, char **table_names, int tables)
 
   if (use_db(db))
     DBUG_RETURN(1);
-  if (opt_all_in_1 && what_to_do != DO_UPGRADE)
+  if (opt_all_in_1 && what_to_do != DO_FIX_NAMES)
   {
     /* 
       We need table list in form `a`, `b`, `c`
@@ -565,6 +542,15 @@ static int process_selected_tables(char *db, char **table_names, int tables)
     size_t tot_length= 0;
     int             i= 0;
 
+    if (opt_do_tables && opt_do_views)
+    {
+      fprintf(stderr, "Error: %s cannot process both tables and views "
+                      "in one command (--process-tables=YES "
+                      "--process-views=YES --all-in-1).\n",
+              my_progname);
+      DBUG_RETURN(1);
+    }
+
     for (i = 0; i < tables; i++)
       tot_length+= fixed_name_length(*(table_names + i)) + 2;
 
@@ -579,12 +565,8 @@ static int process_selected_tables(char *db, char **table_names, int tables)
       *end++= ',';
     }
     *--end = 0;
-    table= table_names_comma_sep + 1;
-    table_len= tot_length - 1;
-    view= is_view(table, table_len);
-    if (view < 0)
-      DBUG_RETURN(1);
-    handle_request_for_tables(table, table_len, (view==1));
+    handle_request_for_tables(table_names_comma_sep + 1, tot_length - 1,
+                              opt_do_views != 0);
     my_free(table_names_comma_sep);
   }
   else
@@ -592,10 +574,10 @@ static int process_selected_tables(char *db, char **table_names, int tables)
     {
       table= *table_names;
       table_len= fixed_name_length(*table_names);
-      view= is_view(table, table_len);
+      view= is_view(table);
       if (view < 0)
         continue;
-      handle_request_for_tables(table, table_len, (view==1));
+      handle_request_for_tables(table, table_len, (view == 1));
     }
   DBUG_RETURN(0);
 } /* process_selected_tables */
@@ -662,7 +644,7 @@ static int process_all_tables_in_db(char *database)
 
   num_columns= mysql_num_fields(res);
 
-  if (opt_all_in_1 && what_to_do != DO_UPGRADE)
+  if (opt_all_in_1 && what_to_do != DO_FIX_NAMES)
   {
     /*
       We need table list in form `a`, `b`, `c`
@@ -679,9 +661,9 @@ static int process_all_tables_in_db(char *database)
     while ((row = mysql_fetch_row(res)))
     {
       if ((num_columns == 2) && (strcmp(row[1], "VIEW") == 0) &&
-          opt_upgrade_views)
+          opt_do_views)
         tot_views_length+= fixed_name_length(row[0]) + 2;
-      else if (opt_fix_tables)
+      else if (opt_do_tables)
         tot_length+= fixed_name_length(row[0]) + 2;
     }
     mysql_data_seek(res, 0);
@@ -702,14 +684,14 @@ static int process_all_tables_in_db(char *database)
     {
       if ((num_columns == 2) && (strcmp(row[1], "VIEW") == 0))
       {
-        if (!opt_upgrade_views)
+        if (!opt_do_views)
           continue;
         views_end= fix_table_name(views_end, row[0]);
         *views_end++= ',';
       }
       else
       {
-        if (!opt_fix_tables)
+        if (!opt_do_tables)
           continue;
         end= fix_table_name(end, row[0]);
         *end++= ',';
@@ -729,15 +711,15 @@ static int process_all_tables_in_db(char *database)
     while ((row = mysql_fetch_row(res)))
     {
       /* Skip views if we don't perform renaming. */
-      if ((what_to_do != DO_UPGRADE) && (num_columns == 2) && (strcmp(row[1], "VIEW") == 0))
+      if ((what_to_do != DO_FIX_NAMES) && (num_columns == 2) && (strcmp(row[1], "VIEW") == 0))
       {
-        if (!opt_upgrade_views)
+        if (!opt_do_views)
           continue;
         view= TRUE;
       }
       else
       {
-        if (!opt_fix_tables)
+        if (!opt_do_tables)
           continue;
         view= FALSE;
       }
@@ -825,7 +807,7 @@ static int process_one_db(char *database)
 
   if (verbose)
     puts(database);
-  if (what_to_do == DO_UPGRADE)
+  if (what_to_do == DO_FIX_NAMES)
   {
     int rc= 0;
     if (opt_fix_db_names && !strncmp(database,"#mysql50#", 9))
@@ -864,7 +846,7 @@ static int disable_binlog()
   return run_query(stmt);
 }
 
-static int handle_request_for_tables(char *tables, uint length, my_bool view)
+static int handle_request_for_tables(char *tables, size_t length, my_bool view)
 {
   char *query, *end, options[100], message[100];
   char table_name_buff[NAME_CHAR_LEN*2*2+1], *table_name;
@@ -887,21 +869,28 @@ static int handle_request_for_tables(char *tables, uint length, my_bool view)
     if (opt_upgrade)            end = strmov(end, " FOR UPGRADE");
     break;
   case DO_REPAIR:
-    op= (opt_write_binlog) ?
-         "REPAIR" : "REPAIR NO_WRITE_TO_BINLOG";
-    if (opt_quick)              end = strmov(end, " QUICK");
-    if (opt_extended)           end = strmov(end, " EXTENDED");
-    if (opt_frm)                end = strmov(end, " USE_FRM");
-    if (opt_upgrade_views==UPGRADE_VIEWS_FROM_MYSQL && view)
-                                end = strmov(end, " FROM MYSQL");
+    op= opt_write_binlog ?  "REPAIR" : "REPAIR NO_WRITE_TO_BINLOG";
+    if (view)
+    {
+      if (opt_do_views == DO_VIEWS_FROM_MYSQL) end = strmov(end, " FROM MYSQL");
+    }
+    else
+    {
+      if (opt_quick)    end = strmov(end, " QUICK");
+      if (opt_extended) end = strmov(end, " EXTENDED");
+      if (opt_frm)      end = strmov(end, " USE_FRM");
+    }
     break;
   case DO_ANALYZE:
+    DBUG_ASSERT(!view);
     op= (opt_write_binlog) ? "ANALYZE" : "ANALYZE NO_WRITE_TO_BINLOG";
     break;
   case DO_OPTIMIZE:
+    DBUG_ASSERT(!view);
     op= (opt_write_binlog) ? "OPTIMIZE" : "OPTIMIZE NO_WRITE_TO_BINLOG";
     break;
-  case DO_UPGRADE:
+  case DO_FIX_NAMES:
+    DBUG_ASSERT(!view);
     DBUG_RETURN(fix_table_storage_name(tables));
   }
 
@@ -929,7 +918,6 @@ static int handle_request_for_tables(char *tables, uint length, my_bool view)
   if (mysql_real_query(sock, query, query_length))
   {
     sprintf(message, "when executing '%s%s... %s'", op, tab_view, options);
-    /* sprintf(message, "when executing '%s'", query); */
     DBerror(sock, message);
     my_free(query);
     DBUG_RETURN(1);
diff --git a/mysql-test/r/log_tables_upgrade.result b/mysql-test/r/log_tables_upgrade.result
index 5ed59eecc31..e68b34ed18d 100644
--- a/mysql-test/r/log_tables_upgrade.result
+++ b/mysql-test/r/log_tables_upgrade.result
@@ -11,8 +11,9 @@ Table	Op	Msg_type	Msg_text
 test.bug49823	repair	status	OK
 RENAME TABLE general_log TO renamed_general_log;
 RENAME TABLE test.bug49823 TO general_log;
-Phase 1/3: Fixing table and database names
-Phase 2/3: Checking and upgrading tables
+Phase 1/4: Fixing views
+Phase 2/4: Fixing table and database names
+Phase 3/4: Checking and upgrading tables
 Processing databases
 information_schema
 mtr
@@ -44,7 +45,7 @@ mysql.time_zone_transition_type                    OK
 mysql.user                                         OK
 performance_schema
 test
-Phase 3/3: Running 'mysql_fix_privilege_tables'...
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
 DROP TABLE general_log;
 RENAME TABLE renamed_general_log TO general_log;
diff --git a/mysql-test/r/mysql_upgrade.result b/mysql-test/r/mysql_upgrade.result
index 502242a9845..8b8fea2909d 100644
--- a/mysql-test/r/mysql_upgrade.result
+++ b/mysql-test/r/mysql_upgrade.result
@@ -32,7 +32,7 @@ mysql.time_zone_transition_type                    OK
 mysql.user                                         OK
 performance_schema
 test
-Phase 4/4: Running 'mysql_fix_privilege_tables'...
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
 Run it again - should say already completed
 This installation of MySQL is already upgraded to VERSION, use --force if you still need to run mysql_upgrade
@@ -70,7 +70,7 @@ mysql.time_zone_transition_type                    OK
 mysql.user                                         OK
 performance_schema
 test
-Phase 4/4: Running 'mysql_fix_privilege_tables'...
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
 CREATE USER mysqltest1@'%' IDENTIFIED by 'sakila';
 GRANT ALL ON *.* TO mysqltest1@'%';
@@ -108,7 +108,7 @@ mysql.time_zone_transition_type                    OK
 mysql.user                                         OK
 performance_schema
 test
-Phase 4/4: Running 'mysql_fix_privilege_tables'...
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
 DROP USER mysqltest1@'%';
 Version check failed. Got the following error when calling the 'mysql' command line client
@@ -151,7 +151,7 @@ mysql.time_zone_transition_type                    OK
 mysql.user                                         OK
 performance_schema
 test
-Phase 4/4: Running 'mysql_fix_privilege_tables'...
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
 set GLOBAL sql_mode=default;
 #
@@ -195,7 +195,7 @@ mysql.time_zone_transition_type                    OK
 mysql.user                                         OK
 performance_schema
 test
-Phase 4/4: Running 'mysql_fix_privilege_tables'...
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
 CALL testproc();
 DROP PROCEDURE testproc;
@@ -242,7 +242,7 @@ mysql.time_zone_transition_type                    OK
 mysql.user                                         OK
 performance_schema
 test
-Phase 4/4: Running 'mysql_fix_privilege_tables'...
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
 SHOW GRANTS FOR 'user3'@'%';
 Grants for user3@%
@@ -251,7 +251,10 @@ GRANT ALL PRIVILEGES ON `roelt`.`test2` TO 'user3'@'%'
 DROP USER 'user3'@'%';
 End of 5.1 tests
 The --upgrade-system-tables option was used, databases won't be touched.
-Phase 1/4: Running 'mysql_fix_privilege_tables'...
+Phase 1/4: Fixing views... Skipped
+Phase 2/4: Fixing table and database names ... Skipped
+Phase 3/4: Checking and upgrading tables... Skipped
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
 #
 # Bug#11827359 60223: MYSQL_UPGRADE PROBLEM WITH OPTION
@@ -292,7 +295,7 @@ mysql.time_zone_transition_type                    OK
 mysql.user                                         OK
 performance_schema
 test
-Phase 4/4: Running 'mysql_fix_privilege_tables'...
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
 #
 # MDEV-4332 Increase username length from 16 characters
@@ -353,7 +356,7 @@ mysql.time_zone_transition_type                    OK
 mysql.user                                         OK
 performance_schema
 test
-Phase 4/4: Running 'mysql_fix_privilege_tables'...
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
 SELECT definer FROM mysql.proc WHERE db = 'test' AND name = 'pr';
 definer
diff --git a/mysql-test/r/mysql_upgrade_ssl.result b/mysql-test/r/mysql_upgrade_ssl.result
index a08e7c115cc..858a2d405c3 100644
--- a/mysql-test/r/mysql_upgrade_ssl.result
+++ b/mysql-test/r/mysql_upgrade_ssl.result
@@ -1,8 +1,9 @@
 #
 # Bug#55672 mysql_upgrade dies with internal error 
 #
-Phase 1/3: Fixing table and database names
-Phase 2/3: Checking and upgrading tables
+Phase 1/4: Fixing views
+Phase 2/4: Fixing table and database names
+Phase 3/4: Checking and upgrading tables
 Processing databases
 information_schema
 mtr
@@ -33,5 +34,5 @@ mysql.time_zone_transition_type                    OK
 mysql.user                                         OK
 performance_schema
 test
-Phase 3/3: Running 'mysql_fix_privilege_tables'...
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
diff --git a/mysql-test/r/mysql_upgrade_view.result b/mysql-test/r/mysql_upgrade_view.result
index aa393190e82..0e71d7f2c4b 100644
--- a/mysql-test/r/mysql_upgrade_view.result
+++ b/mysql-test/r/mysql_upgrade_view.result
@@ -4,6 +4,30 @@ drop view if exists t1,v1,v2,v3,v4,v1badcheck;
 create table t1(a int);
 create table kv(k varchar(30) NOT NULL PRIMARY KEY,v  varchar(50));
 flush tables;
+check view v1;
+Table	Op	Msg_type	Msg_text
+test.v1	check	status	OK
+check view v1badcheck;
+Table	Op	Msg_type	Msg_text
+test.v1badcheck	check	note	View text checksum failed
+check view v2;
+Table	Op	Msg_type	Msg_text
+test.v2	check	status	OK
+check view v3;
+Table	Op	Msg_type	Msg_text
+test.v3	check	status	OK
+check view v1 for upgrade;
+Table	Op	Msg_type	Msg_text
+test.v1	check	error	Upgrade required. Please do "REPAIR VIEW `v1`" or dump/reload to fix it!
+check view v1badcheck for upgrade;
+Table	Op	Msg_type	Msg_text
+test.v1badcheck	check	note	View text checksum failed
+check view v2 for upgrade;
+Table	Op	Msg_type	Msg_text
+test.v2	check	error	Upgrade required. Please do "REPAIR VIEW `v2`" or dump/reload to fix it!
+check view v3 for upgrade;
+Table	Op	Msg_type	Msg_text
+test.v3	check	error	Upgrade required. Please do "REPAIR VIEW `v3`" or dump/reload to fix it!
 Phase 1/4: Fixing views
 test.v1                                            OK
 test.v1badcheck                                    OK
@@ -43,7 +67,7 @@ performance_schema
 test
 test.kv                                            OK
 test.t1                                            OK
-Phase 4/4: Running 'mysql_fix_privilege_tables'...
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
 show create view v1;
 View	Create View	character_set_client	collation_connection
@@ -107,6 +131,7 @@ k
 mariadb-version
 truncate table kv;
 drop view if exists v1,v2,v3,v1badcheck;
+rename table mysql.event to mysql.ev_bk;
 flush tables;
 create algorithm=temptable view v4 as select a from t1;
 show create view v1;
@@ -162,7 +187,7 @@ performance_schema
 test
 test.kv                                            OK
 test.t1                                            OK
-Phase 4/4: Running 'mysql_fix_privilege_tables'...
+Phase 4/4: Running 'mysql_fix_privilege_tables'
 OK
 show create view v1;
 View	Create View	character_set_client	collation_connection
@@ -186,7 +211,10 @@ k
 mariadb-version
 truncate table kv;
 drop view if exists v1,v2,v3;
-flush tables;
+drop table mysql.event;
+rename table mysql.ev_bk to mysql.event;
+test.kv                                            OK
+test.t1                                            OK
 test.v1                                            OK
 test.v2                                            OK
 test.v3                                            OK
@@ -195,11 +223,12 @@ show binlog events from <binlog_start>;
 Log_name	Pos	Event_type	Server_id	End_log_pos	Info
 master-bin.000001	#	Query	#	#	use `test`; REPAIR VIEW v1,v2
 master-bin.000001	#	Query	#	#	use `test`; REPAIR VIEW v1badcheck
+master-bin.000001	#	Query	#	#	use `test`; REPAIR TABLE `kv`  USE_FRM
+master-bin.000001	#	Query	#	#	use `test`; REPAIR TABLE `t1`  USE_FRM
 master-bin.000001	#	Query	#	#	use `test`; REPAIR VIEW `v1`  FROM MYSQL
 master-bin.000001	#	Query	#	#	use `test`; REPAIR VIEW `v2`  FROM MYSQL
 master-bin.000001	#	Query	#	#	use `test`; REPAIR VIEW `v3`  FROM MYSQL
 master-bin.000001	#	Query	#	#	use `test`; REPAIR VIEW `v4`  FROM MYSQL
-flush tables;
 drop table if exists kv;
 drop view v1,v2,v3,v4;
 drop table t1;
diff --git a/mysql-test/t/mysql_upgrade_view.test b/mysql-test/t/mysql_upgrade_view.test
index 1b491a71227..3ecf66d70a5 100644
--- a/mysql-test/t/mysql_upgrade_view.test
+++ b/mysql-test/t/mysql_upgrade_view.test
@@ -18,6 +18,16 @@ let $MYSQLD_DATADIR= `select @@datadir`;
 
 flush tables;
 
+check view v1;
+check view v1badcheck;
+check view v2;
+check view v3;
+
+check view v1 for upgrade;
+check view v1badcheck for upgrade;
+check view v2 for upgrade;
+check view v3 for upgrade;
+
 --replace_result $MYSQLTEST_VARDIR var
 --exec $MYSQL_UPGRADE --force 2>&1
 
@@ -67,12 +77,7 @@ drop view if exists v1,v2,v3,v1badcheck;
 
 # Make it look like a MySQL directory now
 
---copy_file $MYSQLD_DATADIR/mysql/event.MYI $MYSQLD_DATADIR/mysql/ev_bk.MYI
---copy_file $MYSQLD_DATADIR/mysql/event.MYD $MYSQLD_DATADIR/mysql/ev_bk.MYD
---copy_file $MYSQLD_DATADIR/mysql/event.frm $MYSQLD_DATADIR/mysql/ev_bk.frm
---remove_file $MYSQLD_DATADIR/mysql/event.MYI
---remove_file $MYSQLD_DATADIR/mysql/event.MYD
---remove_file $MYSQLD_DATADIR/mysql/event.frm
+rename table mysql.event to mysql.ev_bk;
 --copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/event.MYI $MYSQLD_DATADIR/mysql/event.MYI
 --copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/event.MYD $MYSQLD_DATADIR/mysql/event.MYD
 --copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/event.frm $MYSQLD_DATADIR/mysql/event.frm
@@ -108,38 +113,19 @@ truncate table kv;
 drop view if exists v1,v2,v3;
 --enable_warnings
 
-
---remove_file $MYSQLD_DATADIR/mysql/event.MYI
---remove_file $MYSQLD_DATADIR/mysql/event.MYD
---remove_file $MYSQLD_DATADIR/mysql/event.frm
-
---copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/event.MYI $MYSQLD_DATADIR/mysql/event.MYI
---copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/event.MYD $MYSQLD_DATADIR/mysql/event.MYD
---copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/event.frm $MYSQLD_DATADIR/mysql/event.frm
+# back to mariadb default
+drop table mysql.event;
+rename table mysql.ev_bk to mysql.event;
 
 --copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/v1.frm $MYSQLD_DATADIR/test/v1.frm
 --copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/v2.frm $MYSQLD_DATADIR/test/v2.frm
 --copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/v3.frm $MYSQLD_DATADIR/test/v3.frm
-flush tables;
 
-# check of binlog
---exec $MYSQL_CHECK --write-binlog --upgrade-views=FROM_MYSQL --skip-fix-tables --all-databases 2>&1
+# check of binlog and mixing tables (with table specific options) and views
+--exec $MYSQL_CHECK --repair --write-binlog --process-tables --use-frm --process-views=UPGRADE_FROM_MYSQL test 2>&1
 
 --source include/show_binlog_events.inc
 
-# back to mariadb default
-
---remove_file $MYSQLD_DATADIR/mysql/event.MYI
---remove_file $MYSQLD_DATADIR/mysql/event.MYD
---remove_file $MYSQLD_DATADIR/mysql/event.frm
---copy_file $MYSQLD_DATADIR/mysql/ev_bk.MYI $MYSQLD_DATADIR/mysql/event.MYI
---copy_file $MYSQLD_DATADIR/mysql/ev_bk.MYD $MYSQLD_DATADIR/mysql/event.MYD
---copy_file $MYSQLD_DATADIR/mysql/ev_bk.frm $MYSQLD_DATADIR/mysql/event.frm
---remove_file $MYSQLD_DATADIR/mysql/ev_bk.MYI
---remove_file $MYSQLD_DATADIR/mysql/ev_bk.MYD
---remove_file $MYSQLD_DATADIR/mysql/ev_bk.frm
-flush tables;
-
 drop table if exists kv;
 drop view v1,v2,v3,v4;
 drop table t1;
diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc
index 65292a526fa..44057b6220e 100644
--- a/sql/sql_admin.cc
+++ b/sql/sql_admin.cc
@@ -869,7 +869,16 @@ send_result_message:
       size_t length;
 
       protocol->store(STRING_WITH_LEN("error"), system_charset_info);
-      if (table->table->file->ha_table_flags() & HA_CAN_REPAIR)
+#if MYSQL_VERSION_ID > 100104
+#error fix the error message to take TABLE or VIEW as an argument
+#else
+      if (table->view)
+        length= my_snprintf(buf, sizeof(buf),
+                            "Upgrade required. Please do \"REPAIR VIEW %`s\" or dump/reload to fix it!",
+                            table->table_name);
+      else
+#endif
+      if (table->table->file->ha_table_flags() & HA_CAN_REPAIR || table->view)
         length= my_snprintf(buf, sizeof(buf), ER(ER_TABLE_NEEDS_UPGRADE),
                             table->table_name);
       else
diff --git a/sql/sql_view.cc b/sql/sql_view.cc
index 24f01aeaa76..47b238715ac 100644
--- a/sql/sql_view.cc
+++ b/sql/sql_view.cc
@@ -828,25 +828,6 @@ int mariadb_fix_view(THD *thd, TABLE_LIST *view, bool wrong_checksum,
   if (!view->timestamp.str)
     view->timestamp.str= view->timestamp_buffer;
 
-  /* check old .frm */
-  {
-    char path_buff[FN_REFLEN];
-    LEX_STRING path;
-    File_parser *parser;
-
-    path.str= path_buff;
-    fn_format(path_buff, file.str, dir.str, "", MY_UNPACK_FILENAME);
-    path.length= strlen(path_buff);
-    if (access(path.str, F_OK))
-      DBUG_RETURN(HA_ADMIN_INVALID);
-
-    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)
   {
     DBUG_ASSERT(view->algorithm == VIEW_ALGORITHM_MERGE ||
@@ -877,13 +858,13 @@ int mariadb_fix_view(THD *thd, TABLE_LIST *view, bool wrong_checksum,
                     view->db, view->table_name);
     DBUG_RETURN(HA_ADMIN_INTERNAL_ERROR);
   }
-  sql_print_information("View '%-.192s'.'%-.192s': versioned to %llu%s%s",
+  sql_print_information("View %`s.%`s: the version is set to %llu%s%s",
                         view->db, view->table_name, view->mariadb_version,
-                        (wrong_checksum ? ", and checksum corrected" : ""),
+                        (wrong_checksum ? ", checksum corrected" : ""),
                         (swap_alg ?
                           ((view->algorithm == VIEW_ALGORITHM_MERGE) ?
-                            ", and algorithm swapped to 'MERGE'"
-                           : ", and algorithm swapped to 'TEMPTABLE'")
+                            ", algorithm restored to be MERGE"
+                           : ", algorithm restored to be TEMPTABLE")
                          : ""));
 
 
@@ -2046,20 +2027,15 @@ int view_checksum(THD *thd, TABLE_LIST *view)
 */
 int view_check(THD *thd, TABLE_LIST *view, HA_CHECK_OPT *check_opt)
 {
-  int res;
   DBUG_ENTER("view_check");
-  if ((res= view_checksum(thd, view)) != HA_ADMIN_OK)
+
+  int res= view_checksum(thd, view);
+  if (res != HA_ADMIN_OK)
     DBUG_RETURN(res);
-  if (((check_opt->sql_flags & TT_FOR_UPGRADE) &&
-       !view->mariadb_version))
-  {
-    push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
-                            ER_TABLE_NEEDS_UPGRADE,
-                            ER(ER_TABLE_NEEDS_UPGRADE),
-                            view->db,
-                            view->table_name);
+
+  if (((check_opt->sql_flags & TT_FOR_UPGRADE) && !view->mariadb_version))
     DBUG_RETURN(HA_ADMIN_NEEDS_UPGRADE);
-  }
+
   DBUG_RETURN(HA_ADMIN_OK);
 }
 
@@ -2080,7 +2056,7 @@ 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);
-  bool wrong_checksum= view_checksum(thd, view);
+  bool wrong_checksum= view_checksum(thd, view) != HA_ADMIN_OK;
   int ret;
   if (wrong_checksum || swap_alg || (!view->mariadb_version))
   {
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 8f135e63113..cc16101c38b 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -13806,19 +13806,13 @@ lock:
         ;
 
 table_or_tables:
-          TABLE_SYM
-         { Lex->only_view= FALSE; }
-        | TABLES
-         { Lex->only_view= FALSE; }
+          TABLE_SYM        { Lex->only_view= FALSE; }
+        | TABLES           { Lex->only_view= FALSE; }
         ;
 
 table_or_view:
-          TABLE_SYM
-         { Lex->only_view= FALSE; }
-        | TABLES
-         { Lex->only_view= FALSE; }
-        | VIEW_SYM
-         { Lex->only_view= TRUE; }
+          table_or_tables
+        | VIEW_SYM         { Lex->only_view= TRUE;  }
         ;
 
 table_lock_list: