[Commits] Rev 4407: MDEV-6916: Upgrade from MySQL to MariaDB breaks already created views in file:///home/bell/maria/bzr/work-maria-5.5-MDEV-6916-check_view/
sanja at askmonty.org
sanja at askmonty.org
Sun Feb 8 21:40:31 EET 2015
At file:///home/bell/maria/bzr/work-maria-5.5-MDEV-6916-check_view/
------------------------------------------------------------
revno: 4407
revision-id: sanja at askmonty.org-20150208194010-4tgpixozyvsqyk3i
parent: svoj at mariadb.org-20150114135038-v50g2cul4vce63h8
committer: sanja at askmonty.org
branch nick: work-maria-5.5-MDEV-6916-check_view
timestamp: Sun 2015-02-08 20:40:10 +0100
message:
MDEV-6916: Upgrade from MySQL to MariaDB breaks already created views
CHECK/REPAIR commands for upgrade server support.
-------------- next part --------------
=== modified file 'include/myisamchk.h'
--- a/include/myisamchk.h 2014-01-22 14:29:36 +0000
+++ b/include/myisamchk.h 2015-02-08 19:40:10 +0000
@@ -34,6 +34,7 @@
#define TT_USEFRM 1
#define TT_FOR_UPGRADE 2
+#define TT_FROM_MYSQL 4
/* Bits set in out_flag */
#define O_NEW_DATA 2
=== modified file 'mysql-test/r/view.result'
--- a/mysql-test/r/view.result 2014-12-21 18:23:28 +0000
+++ b/mysql-test/r/view.result 2015-02-08 19:40:10 +0000
@@ -5398,6 +5398,94 @@ DROP VIEW v1;
DROP TABLE t1, t2;
create view v1 as select 1;
drop view v1;
+#
+#CHECK/REPAIR VIEW syntax
+#
+create table t1 (a int);
+create view v1 as select a from t1;
+check view v1, t1;
+Table Op Msg_type Msg_text
+test.v1 check status OK
+test.t1 check Error Table 'test.t1' doesn't exist
+test.t1 check status Operation failed
+check view v1 FOR UPGRADE;
+Table Op Msg_type Msg_text
+test.v1 check status OK
+check view v1 QUICK;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
+check view v1 FAST;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
+check view v1 EXTENDED;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
+check view v1 CHANGED;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
+repair view v1, t1;
+Table Op Msg_type Msg_text
+test.v1 repair status OK
+test.t1 repair Error Table 'test.t1' doesn't exist
+test.t1 repair status Operation failed
+repair view v1 FROM MYSQL;
+Table Op Msg_type Msg_text
+test.v1 repair status OK
+repair table t1 FROM MYSQL;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
+repair view v1 QUICK;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
+repair view v1 EXTENDED;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
+repair view v1 USE_FRM;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
+drop view v1;
+drop table t1;
+#
+#CHECK/REPAIR VIEW
+#
+create table t1(a int);
+create view v5 as select a from t1;
+show create view v1;
+View Create View character_set_client collation_connection
+v1 CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` utf8 utf8_general_ci
+show create view v2;
+View Create View character_set_client collation_connection
+v2 CREATE ALGORITHM=TEMPTABLE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select `t1`.`a` AS `a` from `t1` utf8 utf8_general_ci
+show create view v3;
+View Create View character_set_client collation_connection
+v3 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS select `t1`.`a` AS `a` from `t1` utf8 utf8_general_ci
+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;
+Table Op Msg_type Msg_text
+test.v1 repair status view is repaired
+test.v2 repair status view is repaired
+test.v3 repair status view is repaired
+test.v4 repair status view is repaired
+test.v5 repair status OK
+check view v1,v2,v3,v4,v5 FOR UPGRADE;
+Table Op Msg_type Msg_text
+test.v1 check status OK
+test.v2 check status OK
+test.v3 check status OK
+test.v4 check status OK
+test.v5 check status OK
+show create view v1;
+View Create View character_set_client collation_connection
+v1 CREATE ALGORITHM=TEMPTABLE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` utf8 utf8_general_ci
+show create view v2;
+View Create View character_set_client collation_connection
+v2 CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select `t1`.`a` AS `a` from `t1` utf8 utf8_general_ci
+show create view v3;
+View Create View character_set_client collation_connection
+v3 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS select `t1`.`a` AS `a` from `t1` utf8 utf8_general_ci
+drop view v1,v2,v3,v4,v5;
+drop table t1;
# -----------------------------------------------------------------
# -- End of 5.5 tests.
# -----------------------------------------------------------------
=== added directory 'mysql-test/std_data/mysql_upgrade'
=== added file 'mysql-test/std_data/mysql_upgrade/v1.frm'
--- a/mysql-test/std_data/mysql_upgrade/v1.frm 1970-01-01 00:00:00 +0000
+++ b/mysql-test/std_data/mysql_upgrade/v1.frm 2015-02-08 19:40:10 +0000
@@ -0,0 +1,15 @@
+TYPE=VIEW
+query=select `test`.`t1`.`a` AS `a` from `test`.`t1`
+md5=5e6eaf216e7b016fcedfd4e1113517af
+updatable=0
+algorithm=1
+definer_user=root
+definer_host=localhost
+suid=2
+with_check_option=0
+timestamp=2014-12-11 15:26:20
+create-version=1
+source=select a from t1
+client_cs_name=utf8
+connection_cl_name=utf8_general_ci
+view_body_utf8=select `test`.`t1`.`a` AS `a` from `test`.`t1`
=== added file 'mysql-test/std_data/mysql_upgrade/v2.frm'
--- a/mysql-test/std_data/mysql_upgrade/v2.frm 1970-01-01 00:00:00 +0000
+++ b/mysql-test/std_data/mysql_upgrade/v2.frm 2015-02-08 19:40:10 +0000
@@ -0,0 +1,15 @@
+TYPE=VIEW
+query=select `test`.`t1`.`a` AS `a` from `test`.`t1`
+md5=5e6eaf216e7b016fcedfd4e1113517af
+updatable=1
+algorithm=2
+definer_user=root
+definer_host=localhost
+suid=2
+with_check_option=0
+timestamp=2014-12-11 15:26:29
+create-version=1
+source=select a from t1
+client_cs_name=utf8
+connection_cl_name=utf8_general_ci
+view_body_utf8=select `test`.`t1`.`a` AS `a` from `test`.`t1`
=== added file 'mysql-test/std_data/mysql_upgrade/v3.frm'
--- a/mysql-test/std_data/mysql_upgrade/v3.frm 1970-01-01 00:00:00 +0000
+++ b/mysql-test/std_data/mysql_upgrade/v3.frm 2015-02-08 19:40:10 +0000
@@ -0,0 +1,15 @@
+TYPE=VIEW
+query=select `test`.`t1`.`a` AS `a` from `test`.`t1`
+md5=5e6eaf216e7b016fcedfd4e1113517af
+updatable=0
+algorithm=0
+definer_user=root
+definer_host=localhost
+suid=2
+with_check_option=0
+timestamp=2014-12-11 15:26:20
+create-version=1
+source=select a from t1
+client_cs_name=utf8
+connection_cl_name=utf8_general_ci
+view_body_utf8=select `test`.`t1`.`a` AS `a` from `test`.`t1`
=== added file 'mysql-test/std_data/mysql_upgrade/v4.frm'
--- a/mysql-test/std_data/mysql_upgrade/v4.frm 1970-01-01 00:00:00 +0000
+++ b/mysql-test/std_data/mysql_upgrade/v4.frm 2015-02-08 19:40:10 +0000
@@ -0,0 +1,16 @@
+TYPE=VIEW
+query=select `test`.`t1`.`a` AS `a` from `test`.`t1`
+md5=5e6eaf216e7b016fcedfd4e1113517a0
+updatable=1
+algorithm=0
+definer_user=root
+definer_host=localhost
+suid=2
+with_check_option=0
+timestamp=2015-02-08 19:21:14
+create-version=1
+source=select a from t1
+client_cs_name=latin1
+connection_cl_name=latin1_swedish_ci
+view_body_utf8=select `test`.`t1`.`a` AS `a` from `test`.`t1`
+mariadb-version=50542
=== modified file 'mysql-test/t/view.test'
--- a/mysql-test/t/view.test 2014-12-21 18:23:28 +0000
+++ b/mysql-test/t/view.test 2015-02-08 19:40:10 +0000
@@ -5345,6 +5345,61 @@ create view v1 as select 1;
drop view v1;
+--echo #
+--echo #CHECK/REPAIR VIEW syntax
+--echo #
+
+create table t1 (a int);
+create view v1 as select a from t1;
+
+check view v1, t1;
+check view v1 FOR UPGRADE;
+--error ER_PARSE_ERROR
+check view v1 QUICK;
+--error ER_PARSE_ERROR
+check view v1 FAST;
+--error ER_PARSE_ERROR
+check view v1 EXTENDED;
+--error ER_PARSE_ERROR
+check view v1 CHANGED;
+repair view v1, t1;
+repair view v1 FROM MYSQL;
+--error ER_PARSE_ERROR
+repair table t1 FROM MYSQL;
+--error ER_PARSE_ERROR
+repair view v1 QUICK;
+--error ER_PARSE_ERROR
+repair view v1 EXTENDED;
+--error ER_PARSE_ERROR
+repair view v1 USE_FRM;
+
+drop view v1;
+drop table t1;
+
+--echo #
+--echo #CHECK/REPAIR VIEW
+--echo #
+create table t1(a int);
+let $MYSQLD_DATADIR= `select @@datadir`;
+
+--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
+--copy_file $MYSQL_TEST_DIR/std_data/mysql_upgrade/v4.frm $MYSQLD_DATADIR/test/v4.frm
+create view v5 as select a from t1;
+
+show create view v1;
+show create view v2;
+show create view v3;
+check view v1,v2,v3,v4,v5 FOR UPGRADE;
+repair view v1,v2,v3,v4,v5 FROM MYSQL;
+check view v1,v2,v3,v4,v5 FOR UPGRADE;
+show create view v1;
+show create view v2;
+show create view v3;
+
+drop view v1,v2,v3,v4,v5;
+drop table t1;
--echo # -----------------------------------------------------------------
--echo # -- End of 5.5 tests.
--echo # -----------------------------------------------------------------
=== modified file 'sql/handler.h'
--- a/sql/handler.h 2015-01-13 18:28:03 +0000
+++ b/sql/handler.h 2015-02-08 19:40:10 +0000
@@ -42,6 +42,7 @@
// the following is for checking tables
+#define HA_ADMIN_VIEW_REPAIR_IS_DONE 2
#define HA_ADMIN_ALREADY_DONE 1
#define HA_ADMIN_OK 0
#define HA_ADMIN_NOT_IMPLEMENTED -1
@@ -56,6 +57,7 @@
#define HA_ADMIN_NEEDS_UPGRADE -10
#define HA_ADMIN_NEEDS_ALTER -11
#define HA_ADMIN_NEEDS_CHECK -12
+#define HA_ADMIN_NEEDS_REPAIR -13
/* Bits in table_flags() to show what database can do */
=== modified file 'sql/lex.h'
--- a/sql/lex.h 2012-09-05 15:23:51 +0000
+++ b/sql/lex.h 2015-02-08 19:40:10 +0000
@@ -376,6 +376,7 @@ static SYMBOL symbols[] = {
{ "MULTIPOINT", SYM(MULTIPOINT)},
{ "MULTIPOLYGON", SYM(MULTIPOLYGON)},
{ "MUTEX", SYM(MUTEX_SYM)},
+ { "MYSQL", SYM(MYSQL_SYM)},
{ "MYSQL_ERRNO", SYM(MYSQL_ERRNO_SYM)},
{ "NAME", SYM(NAME_SYM)},
{ "NAMES", SYM(NAMES_SYM)},
=== modified file 'sql/share/errmsg-utf8.txt'
--- a/sql/share/errmsg-utf8.txt 2014-05-27 06:45:01 +0000
+++ b/sql/share/errmsg-utf8.txt 2015-02-08 19:40:10 +0000
@@ -6565,3 +6565,9 @@ ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT
ER_NO_SUCH_TABLE_IN_ENGINE 42S02
eng "Table '%-.192s.%-.192s' doesn't exist in engine"
swe "Det finns ingen tabell som heter '%-.192s.%-.192s' i handlern"
+ER_NO_MARIADB_SERVER_FIELD
+ eng "view '%-.192s.%-.192s' has no field mariadb server in its .frm file"
+ER_VIEW_REPAIR_IS_DONE
+ eng "view is repaired"
+ER_NEEDS_REPAIR
+ eng "needs repair"
=== modified file 'sql/sql_admin.cc'
--- a/sql/sql_admin.cc 2014-05-03 16:12:17 +0000
+++ b/sql/sql_admin.cc 2015-02-08 19:40:10 +0000
@@ -314,7 +314,8 @@ static bool mysql_admin_table(THD* thd,
HA_CHECK_OPT *),
int (handler::*operator_func)(THD *,
HA_CHECK_OPT *),
- int (view_operator_func)(THD *, TABLE_LIST*))
+ int (view_operator_func)(THD *, TABLE_LIST*,
+ HA_CHECK_OPT *))
{
TABLE_LIST *table;
SELECT_LEX *select= &thd->lex->select_lex;
@@ -380,7 +381,18 @@ static bool mysql_admin_table(THD* thd,
lex->query_tables_own_last= 0;
if (view_operator_func == NULL)
+ {
table->required_type=FRMTYPE_TABLE;
+ DBUG_ASSERT(!lex->only_view);
+ }
+ else if (lex->only_view)
+ {
+ table->required_type= FRMTYPE_VIEW;
+ }
+ else if (!lex->only_view && lex->sql_command == SQLCOM_REPAIR)
+ {
+ table->required_type= FRMTYPE_TABLE;
+ }
if (lex->sql_command == SQLCOM_CHECK ||
lex->sql_command == SQLCOM_REPAIR ||
@@ -506,9 +518,9 @@ static bool mysql_admin_table(THD* thd,
}
/*
- CHECK TABLE command is only command where VIEW allowed here and this
- command use only temporary teble method for VIEWs resolving => there
- can't be VIEW tree substitition of join view => if opening table
+ CHECK/REPAIR TABLE command is only command where VIEW allowed here and
+ this command use only temporary table method for VIEWs resolving =>
+ there can't be VIEW tree substitition of join view => if opening table
succeed then table->table will have real TABLE pointer as value (in
case of join view substitution table->table can be 0, but here it is
impossible)
@@ -521,7 +533,7 @@ static bool mysql_admin_table(THD* thd,
ER_CHECK_NO_SUCH_TABLE, ER(ER_CHECK_NO_SUCH_TABLE));
/* if it was a view will check md5 sum */
if (table->view &&
- view_checksum(thd, table) == HA_ADMIN_WRONG_CHECKSUM)
+ view_check(thd, table, check_opt) == HA_ADMIN_WRONG_CHECKSUM)
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_VIEW_CHECKSUM, ER(ER_VIEW_CHECKSUM));
if (thd->stmt_da->is_error() &&
@@ -536,7 +548,7 @@ static bool mysql_admin_table(THD* thd,
if (table->view)
{
DBUG_PRINT("admin", ("calling view_operator_func"));
- result_code= (*view_operator_func)(thd, table);
+ result_code= (*view_operator_func)(thd, table, check_opt);
goto send_result;
}
@@ -867,6 +879,22 @@ send_result_message:
fatal_error=1;
break;
}
+ case HA_ADMIN_VIEW_REPAIR_IS_DONE:
+ {
+ protocol->store(STRING_WITH_LEN("status"), system_charset_info);
+ protocol->store(ER(ER_VIEW_REPAIR_IS_DONE),
+ strlen(ER(ER_VIEW_REPAIR_IS_DONE)),
+ system_charset_info);
+ break;
+ }
+ case HA_ADMIN_NEEDS_REPAIR:
+ {
+ protocol->store(STRING_WITH_LEN("status"), system_charset_info);
+ protocol->store(ER(ER_NEEDS_REPAIR),
+ strlen(ER(ER_NEEDS_REPAIR)),
+ system_charset_info);
+ break;
+ }
default: // Probably HA_ADMIN_INTERNAL_ERROR
{
@@ -1071,7 +1099,7 @@ bool Check_table_statement::execute(THD
res= mysql_admin_table(thd, first_table, &m_lex->check_opt, "check",
lock_type, 0, 0, HA_OPEN_FOR_REPAIR, 0,
- &handler::ha_check, &view_checksum);
+ &handler::ha_check, &view_check);
m_lex->select_lex.table_list.first= first_table;
m_lex->query_tables= first_table;
@@ -1126,7 +1154,7 @@ bool Repair_table_statement::execute(THD
TL_WRITE, 1,
test(m_lex->check_opt.sql_flags & TT_USEFRM),
HA_OPEN_FOR_REPAIR, &prepare_for_repair,
- &handler::ha_repair, 0);
+ &handler::ha_repair, &view_repair);
/* ! we write after unlocking the table */
if (!res && !m_lex->no_write_to_binlog)
=== modified file 'sql/sql_base.cc'
--- a/sql/sql_base.cc 2014-10-31 13:07:29 +0000
+++ b/sql/sql_base.cc 2015-02-08 19:40:10 +0000
@@ -643,7 +643,8 @@ found:
open_table_error(share, share->error, share->open_errno, share->errarg);
DBUG_RETURN(0);
}
- if (share->is_view && !(db_flags & OPEN_VIEW))
+ if ((share->is_view && !(db_flags & OPEN_VIEW)) ||
+ (!share->is_view && (db_flags & OPEN_VIEW_ONLY)))
{
open_table_error(share, 1, ENOENT, 0);
DBUG_RETURN(0);
@@ -3019,12 +3020,17 @@ bool open_table(THD *thd, TABLE_LIST *ta
else if (table_list->open_strategy == TABLE_LIST::OPEN_STUB)
DBUG_RETURN(FALSE);
+
retry_share:
mysql_mutex_lock(&LOCK_open);
if (!(share= get_table_share_with_discover(thd, table_list, key,
- key_length, OPEN_VIEW,
+ key_length,
+ (OPEN_VIEW |
+ ((table_list->required_type ==
+ FRMTYPE_VIEW) ?
+ OPEN_VIEW_ONLY : 0)),
&error,
hash_value)))
{
=== 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-08 19:40:10 +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
#include "sql_truncate.h" // regenerate_locked_table
#include "sql_partition.h" // mem_alloc_error,
// generate_partition_syntax,
=== 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-08 19:40:10 +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 mariadb_fix_view(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);
+
+ make_view_filename(&dir, dir_buff, sizeof(dir_buff),
+ &path, path_buff, sizeof(path_buff),
+ &file, view);
+ /* init timestamp */
+ 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 ||
+ view->algorithm == VIEW_ALGORITHM_TMPTABLE);
+ if (view->algorithm == VIEW_ALGORITHM_MERGE)
+ view->algorithm= VIEW_ALGORITHM_TMPTABLE;
+ else
+ view->algorithm= VIEW_ALGORITHM_MERGE;
+ }
+ if (wrong_checksum)
+ {
+ if (view->md5.length != 32)
+ {
+ if ((view->md5.str= (char *)thd->alloc(32 + 1)) == NULL)
+ DBUG_RETURN(HA_ADMIN_FAILED);
+ }
+ view->calc_md5(view->md5.str);
+ view->md5.length= 32;
+ }
+ view->mariadb_version= MYSQL_VERSION_ID;
+
+ if (sql_create_definition_file(&dir, &file, view_file_type,
+ (uchar*)view, view_parameters))
+ {
+ sql_print_error("View '%-.192s'.'%-.192s': algorithm swap error.",
+ view->db, view->table_name);
+ DBUG_RETURN(HA_ADMIN_INTERNAL_ERROR);
+ }
+ sql_print_information("View '%-.192s'.'%-.192s': algorithm swapped to '%s'",
+ view->db, view->table_name,
+ (view->algorithm == VIEW_ALGORITHM_MERGE)?
+ "MERGE":"TEMPTABLE");
+
+
+ DBUG_RETURN(HA_ADMIN_VIEW_REPAIR_IS_DONE);
+}
+
+
/*
Register VIEW (write .frm & process .frm's history backups)
@@ -927,17 +1022,9 @@ static int mysql_register_view(THD *thd,
}
loop_out:
/* print file name */
- dir.length= build_table_filename(dir_buff, sizeof(dir_buff) - 1,
- view->db, "", "", 0);
- dir.str= dir_buff;
-
- path.length= build_table_filename(path_buff, sizeof(path_buff) - 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;
-
+ make_view_filename(&dir, dir_buff, sizeof(dir_buff),
+ &path, path_buff, sizeof(path_buff),
+ &file, view);
/* init timestamp */
if (!view->timestamp.str)
view->timestamp.str= view->timestamp_buffer;
@@ -1063,7 +1150,7 @@ err:
SYNOPSIS
mysql_make_view()
- thd Thread handler
+ thd Thread handle
parser parser object
table TABLE_LIST structure for filling
flags flags
@@ -1634,7 +1721,7 @@ err:
SYNOPSIS
mysql_drop_view()
- thd - thread handler
+ thd - thread handle
views - views to delete
drop_mode - cascade/check
@@ -1755,7 +1842,7 @@ bool mysql_drop_view(THD *thd, TABLE_LIS
SYNOPSIS
check_key_in_view()
- thd thread handler
+ thd thread handle
view view for check with opened table
DESCRIPTION
@@ -1941,6 +2028,63 @@ int view_checksum(THD *thd, TABLE_LIST *
HA_ADMIN_OK);
}
+/**
+ Check view
+
+ @param thd thread handle
+ @param view view for check
+ @param check_opt check options
+
+ @retval HA_ADMIN_OK OK
+ @retval HA_ADMIN_NOT_IMPLEMENTED it is not VIEW
+ @retval HA_ADMIN_WRONG_CHECKSUM check sum is wrong
+*/
+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)
+ DBUG_RETURN(res);
+ if (((check_opt->sql_flags & TT_FOR_UPGRADE) &&
+ !view->mariadb_version))
+ {
+ push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
+ ER_NO_MARIADB_SERVER_FIELD,
+ ER(ER_NO_MARIADB_SERVER_FIELD),
+ view->db,
+ view->table_name);
+ DBUG_RETURN(HA_ADMIN_NEEDS_REPAIR);
+ }
+ DBUG_RETURN(HA_ADMIN_OK);
+}
+
+
+/**
+ Repair view
+
+ @param thd thread handle
+ @param view view for check
+ @param check_opt check options
+
+ @retval HA_ADMIN_OK OK
+ @retval HA_ADMIN_NOT_IMPLEMENTED it is not VIEW
+ @retval HA_ADMIN_WRONG_CHECKSUM check sum is wrong
+*/
+
+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));
+ }
+ DBUG_RETURN(HA_ADMIN_OK);
+}
+
/*
rename view
=== modified file 'sql/sql_view.h'
--- a/sql/sql_view.h 2011-06-30 15:46:53 +0000
+++ b/sql/sql_view.h 2015-02-08 19:40:10 +0000
@@ -44,6 +44,8 @@ bool check_key_in_view(THD *thd, TABLE_L
bool insert_view_fields(THD *thd, List<Item> *list, TABLE_LIST *view);
int view_checksum(THD *thd, TABLE_LIST *view);
+int view_check(THD *thd, TABLE_LIST *view, HA_CHECK_OPT *check_opt);
+int view_repair(THD *thd, TABLE_LIST *view, HA_CHECK_OPT *check_opt);
extern TYPELIB updatable_views_with_limit_typelib;
=== 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-08 19:40:10 +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 */
@@ -7179,6 +7180,7 @@ checksum:
lex->sql_command = SQLCOM_CHECKSUM;
/* Will be overriden during execution. */
YYPS->m_lock_type= TL_UNLOCK;
+ lex->only_view= FALSE;
}
table_list opt_checksum_type
{}
@@ -7191,11 +7193,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;
+ }
lex->check_opt.init();
lex->alter_info.reset();
/* Will be overriden during execution. */
@@ -7204,6 +7211,15 @@ repair:
table_list opt_mi_repair_type
{
LEX* lex= thd->lex;
+ if ((lex->only_view &&
+ ((lex->check_opt.flags & (T_QUICK | T_EXTEND)) ||
+ (lex->check_opt.sql_flags & TT_USEFRM))) ||
+ (!lex->only_view &&
+ (lex->check_opt.sql_flags & TT_FROM_MYSQL)))
+ {
+ my_parse_error(ER(ER_SYNTAX_ERROR));
+ MYSQL_YYABORT;
+ }
DBUG_ASSERT(!lex->m_stmt);
lex->m_stmt= new (thd->mem_root) Repair_table_statement(lex);
if (lex->m_stmt == NULL)
@@ -7225,6 +7241,7 @@ mi_repair_type:
QUICK { Lex->check_opt.flags|= T_QUICK; }
| EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; }
| USE_FRM { Lex->check_opt.sql_flags|= TT_USEFRM; }
+ | FROM MYSQL_SYM { Lex->check_opt.sql_flags|= TT_FROM_MYSQL; }
;
analyze:
@@ -7237,6 +7254,7 @@ analyze:
lex->alter_info.reset();
/* Will be overriden during execution. */
YYPS->m_lock_type= TL_UNLOCK;
+ lex->only_view= FALSE;
}
table_list
{
@@ -7257,7 +7275,7 @@ binlog_base64_event:
;
check:
- CHECK_SYM table_or_tables
+ CHECK_SYM table_or_view
{
LEX *lex=Lex;
@@ -7275,6 +7293,13 @@ check:
table_list opt_mi_check_type
{
LEX* lex= thd->lex;
+ if (lex->only_view &&
+ (lex->check_opt.flags & (T_QUICK | T_FAST | T_EXTEND |
+ T_CHECK_ONLY_CHANGED)))
+ {
+ my_parse_error(ER(ER_SYNTAX_ERROR));
+ MYSQL_YYABORT;
+ }
DBUG_ASSERT(!lex->m_stmt);
lex->m_stmt= new (thd->mem_root) Check_table_statement(lex);
if (lex->m_stmt == NULL)
@@ -7311,6 +7336,7 @@ optimize:
lex->alter_info.reset();
/* Will be overriden during execution. */
YYPS->m_lock_type= TL_UNLOCK;
+ lex->only_view= FALSE;
}
table_list
{
@@ -13186,6 +13212,7 @@ keyword_sp:
| MULTIPOINT {}
| MULTIPOLYGON {}
| MUTEX_SYM {}
+ | MYSQL_SYM {}
| MYSQL_ERRNO_SYM {}
| NAME_SYM {}
| NAMES_SYM {}
@@ -13788,6 +13815,15 @@ table_or_tables:
| TABLES
;
+table_or_view:
+ TABLE_SYM
+ { Lex->only_view= FALSE; }
+ | TABLES
+ { Lex->only_view= FALSE; }
+ | VIEW_SYM
+ { Lex->only_view= TRUE; }
+ ;
+
table_lock_list:
table_lock
| table_lock_list ',' table_lock
More information about the commits
mailing list