merge
sql/handler.h: Auto merged sql/sql_table.cc: Auto merged sql/sql_view.cc: Auto merged
This commit is contained in:
commit
b3c9963971
@ -1646,3 +1646,18 @@ insert into v4 values (30);
|
||||
ERROR HY000: You can't specify target table 'v4' for update in FROM clause
|
||||
drop view v4, v3, v2, v1;
|
||||
drop table t1;
|
||||
create table t1 (a int);
|
||||
create view v1 as select * from t1;
|
||||
check table t1,v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
test.v1 check status OK
|
||||
check table v1,t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 check status OK
|
||||
test.t1 check status OK
|
||||
drop table t1;
|
||||
check table v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 check error View 'test.v1' references invalid table(s) or column(s)
|
||||
drop view v1;
|
||||
|
@ -1588,3 +1588,14 @@ create view v4 as select * from v2 where 20 < (select (s1) from t1);
|
||||
insert into v4 values (30);
|
||||
drop view v4, v3, v2, v1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# CHECK TABLE with VIEW
|
||||
#
|
||||
create table t1 (a int);
|
||||
create view v1 as select * from t1;
|
||||
check table t1,v1;
|
||||
check table v1,t1;
|
||||
drop table t1;
|
||||
check table v1;
|
||||
drop view v1;
|
||||
|
@ -44,6 +44,7 @@
|
||||
#define HA_ADMIN_INVALID -5
|
||||
#define HA_ADMIN_REJECT -6
|
||||
#define HA_ADMIN_TRY_ALTER -7
|
||||
#define HA_ADMIN_WRONG_CHECKSUM -8
|
||||
|
||||
/* Bits in table_flags() to show what database can do */
|
||||
#define HA_READ_RND_SAME (1 << 0) /* can switch index during the scan
|
||||
|
@ -1748,12 +1748,15 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
||||
int (*prepare_func)(THD *, TABLE_LIST *,
|
||||
HA_CHECK_OPT *),
|
||||
int (handler::*operator_func)
|
||||
(THD *, HA_CHECK_OPT *))
|
||||
(THD *, HA_CHECK_OPT *),
|
||||
int (view_operator_func)
|
||||
(THD *, TABLE_LIST*))
|
||||
{
|
||||
TABLE_LIST *table;
|
||||
TABLE_LIST *table, *next_global_table;
|
||||
List<Item> field_list;
|
||||
Item *item;
|
||||
Protocol *protocol= thd->protocol;
|
||||
int result_code;
|
||||
DBUG_ENTER("mysql_admin_table");
|
||||
|
||||
field_list.push_back(item = new Item_empty_string("Table", NAME_LEN*2));
|
||||
@ -1777,7 +1780,18 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
||||
strxmov(table_name,db ? db : "",".",table->real_name,NullS);
|
||||
|
||||
thd->open_options|= extra_open_options;
|
||||
table->table = open_ltable(thd, table, lock_type);
|
||||
table->lock_type= lock_type;
|
||||
/* open only one table from local list of command */
|
||||
next_global_table= table->next_global;
|
||||
table->next_global= 0;
|
||||
open_and_lock_tables(thd, table);
|
||||
table->next_global= next_global_table;
|
||||
/* if view are unsupported */
|
||||
if (table->view && !view_operator_func)
|
||||
{
|
||||
result_code= HA_ADMIN_NOT_IMPLEMENTED;
|
||||
goto send_result;
|
||||
}
|
||||
thd->open_options&= ~extra_open_options;
|
||||
|
||||
if (prepare_func)
|
||||
@ -1793,8 +1807,13 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
for this command used only temporary table method (without
|
||||
filling tables), so if opening succeed, table will be opened
|
||||
*/
|
||||
if (!table->table)
|
||||
{
|
||||
char buf[ERRMSGSIZE+25];
|
||||
const char *err_msg;
|
||||
protocol->prepare_for_resend();
|
||||
protocol->store(table_name, system_charset_info);
|
||||
@ -1802,12 +1821,26 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
||||
protocol->store("error",5, system_charset_info);
|
||||
if (!(err_msg=thd->net.last_error))
|
||||
err_msg=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)
|
||||
{
|
||||
strxmov(buf, "View checksum failed and ", err_msg, NullS);
|
||||
err_msg= (const char *)buf;
|
||||
}
|
||||
protocol->store(err_msg, system_charset_info);
|
||||
thd->clear_error();
|
||||
if (protocol->write())
|
||||
goto err;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (table->view)
|
||||
{
|
||||
result_code= (*view_operator_func)(thd, table);
|
||||
goto send_result;
|
||||
}
|
||||
|
||||
table->table->pos_in_table_list= table;
|
||||
if ((table->table->db_stat & HA_READ_ONLY) && open_for_modify)
|
||||
{
|
||||
@ -1846,7 +1879,10 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
||||
open_for_modify=0;
|
||||
}
|
||||
|
||||
int result_code = (table->table->file->*operator_func)(thd, check_opt);
|
||||
result_code = (table->table->file->*operator_func)(thd, check_opt);
|
||||
|
||||
send_result:
|
||||
|
||||
thd->clear_error(); // these errors shouldn't get client
|
||||
protocol->prepare_for_resend();
|
||||
protocol->store(table_name, system_charset_info);
|
||||
@ -1922,6 +1958,12 @@ send_result_message:
|
||||
table->next_global= save_next_global;
|
||||
goto send_result_message;
|
||||
}
|
||||
case HA_ADMIN_WRONG_CHECKSUM:
|
||||
{
|
||||
protocol->store("note", 4, system_charset_info);
|
||||
protocol->store("Checksum error", 14, system_charset_info);
|
||||
break;
|
||||
}
|
||||
|
||||
default: // Probably HA_ADMIN_INTERNAL_ERROR
|
||||
protocol->store("error", 5, system_charset_info);
|
||||
@ -1962,7 +2004,7 @@ bool mysql_backup_table(THD* thd, TABLE_LIST* table_list)
|
||||
DBUG_ENTER("mysql_backup_table");
|
||||
DBUG_RETURN(mysql_admin_table(thd, table_list, 0,
|
||||
"backup", TL_READ, 0, 0, 0,
|
||||
&handler::backup));
|
||||
&handler::backup, 0));
|
||||
}
|
||||
|
||||
|
||||
@ -1972,7 +2014,7 @@ bool mysql_restore_table(THD* thd, TABLE_LIST* table_list)
|
||||
DBUG_RETURN(mysql_admin_table(thd, table_list, 0,
|
||||
"restore", TL_WRITE, 1, 0,
|
||||
&prepare_for_restore,
|
||||
&handler::restore));
|
||||
&handler::restore, 0));
|
||||
}
|
||||
|
||||
|
||||
@ -1982,7 +2024,7 @@ bool mysql_repair_table(THD* thd, TABLE_LIST* tables, HA_CHECK_OPT* check_opt)
|
||||
DBUG_RETURN(mysql_admin_table(thd, tables, check_opt,
|
||||
"repair", TL_WRITE, 1, HA_OPEN_FOR_REPAIR,
|
||||
&prepare_for_repair,
|
||||
&handler::repair));
|
||||
&handler::repair, 0));
|
||||
}
|
||||
|
||||
|
||||
@ -1991,7 +2033,7 @@ bool mysql_optimize_table(THD* thd, TABLE_LIST* tables, HA_CHECK_OPT* check_opt)
|
||||
DBUG_ENTER("mysql_optimize_table");
|
||||
DBUG_RETURN(mysql_admin_table(thd, tables, check_opt,
|
||||
"optimize", TL_WRITE, 1,0,0,
|
||||
&handler::optimize));
|
||||
&handler::optimize, 0));
|
||||
}
|
||||
|
||||
|
||||
@ -2027,7 +2069,7 @@ bool mysql_assign_to_keycache(THD* thd, TABLE_LIST* tables,
|
||||
check_opt.key_cache= key_cache;
|
||||
DBUG_RETURN(mysql_admin_table(thd, tables, &check_opt,
|
||||
"assign_to_keycache", TL_READ_NO_INSERT, 0,
|
||||
0, 0, &handler::assign_to_keycache));
|
||||
0, 0, &handler::assign_to_keycache, 0));
|
||||
}
|
||||
|
||||
|
||||
@ -2088,7 +2130,7 @@ bool mysql_preload_keys(THD* thd, TABLE_LIST* tables)
|
||||
DBUG_ENTER("mysql_preload_keys");
|
||||
DBUG_RETURN(mysql_admin_table(thd, tables, 0,
|
||||
"preload_keys", TL_READ, 0, 0, 0,
|
||||
&handler::preload_keys));
|
||||
&handler::preload_keys, 0));
|
||||
}
|
||||
|
||||
|
||||
@ -2253,7 +2295,7 @@ bool mysql_analyze_table(THD* thd, TABLE_LIST* tables, HA_CHECK_OPT* check_opt)
|
||||
DBUG_ENTER("mysql_analyze_table");
|
||||
DBUG_RETURN(mysql_admin_table(thd, tables, check_opt,
|
||||
"analyze", lock_type, 1,0,0,
|
||||
&handler::analyze));
|
||||
&handler::analyze, 0));
|
||||
}
|
||||
|
||||
|
||||
@ -2269,7 +2311,7 @@ bool mysql_check_table(THD* thd, TABLE_LIST* tables,HA_CHECK_OPT* check_opt)
|
||||
DBUG_RETURN(mysql_admin_table(thd, tables, check_opt,
|
||||
"check", lock_type,
|
||||
0, HA_OPEN_FOR_REPAIR, 0,
|
||||
&handler::check));
|
||||
&handler::check, &view_checksum));
|
||||
}
|
||||
|
||||
|
||||
|
@ -21,6 +21,8 @@
|
||||
#include "parse_file.h"
|
||||
#include "sp.h"
|
||||
|
||||
#define MD5_BUFF_LENGTH 33
|
||||
|
||||
static int mysql_register_view(THD *thd, TABLE_LIST *view,
|
||||
enum_view_create_mode mode);
|
||||
|
||||
@ -378,7 +380,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
|
||||
LEX *lex= thd->lex;
|
||||
char buff[4096];
|
||||
String str(buff,(uint32) sizeof(buff), system_charset_info);
|
||||
char md5[33];
|
||||
char md5[MD5_BUFF_LENGTH];
|
||||
bool can_be_merged;
|
||||
char dir_buff[FN_REFLEN], file_buff[FN_REFLEN];
|
||||
LEX_STRING dir, file;
|
||||
@ -1052,3 +1054,28 @@ void insert_view_fields(List<Item> *list, TABLE_LIST *view)
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
/*
|
||||
checking view md5 check suum
|
||||
|
||||
SINOPSYS
|
||||
view_checksum()
|
||||
thd threar handler
|
||||
view view for check
|
||||
|
||||
RETUIRN
|
||||
HA_ADMIN_OK OK
|
||||
HA_ADMIN_NOT_IMPLEMENTED it is not VIEW
|
||||
HA_ADMIN_WRONG_CHECKSUM check sum is wrong
|
||||
*/
|
||||
|
||||
int view_checksum(THD *thd, TABLE_LIST *view)
|
||||
{
|
||||
char md5[MD5_BUFF_LENGTH];
|
||||
if (!view->view || view->md5.length != 32)
|
||||
return HA_ADMIN_NOT_IMPLEMENTED;
|
||||
view->calc_md5(md5);
|
||||
return (strncmp(md5, view->md5.str, 32) ?
|
||||
HA_ADMIN_WRONG_CHECKSUM :
|
||||
HA_ADMIN_OK);
|
||||
}
|
||||
|
@ -29,6 +29,8 @@ void insert_view_fields(List<Item> *list, TABLE_LIST *view);
|
||||
|
||||
frm_type_enum mysql_frm_type(char *path);
|
||||
|
||||
int view_checksum(THD *thd, TABLE_LIST *view);
|
||||
|
||||
extern TYPELIB updatable_views_with_limit_typelib;
|
||||
|
||||
#define VIEW_ANY_ACL (SELECT_ACL | UPDATE_ACL | INSERT_ACL | DELETE_ACL)
|
||||
|
Loading…
x
Reference in New Issue
Block a user