mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
merge
This commit is contained in:
44
mysql-test/r/rpl_view.result
Normal file
44
mysql-test/r/rpl_view.result
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
stop slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
reset master;
|
||||||
|
reset slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
start slave;
|
||||||
|
drop table if exists t1,v1;
|
||||||
|
drop view if exists t1,v1;
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (1);
|
||||||
|
create view v1 as select a from t1;
|
||||||
|
insert into v1 values (2);
|
||||||
|
select * from v1 order by a;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
2
|
||||||
|
select * from v1 order by a;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
2
|
||||||
|
update v1 set a=3 where a=1;
|
||||||
|
select * from v1 order by a;
|
||||||
|
a
|
||||||
|
2
|
||||||
|
3
|
||||||
|
select * from v1 order by a;
|
||||||
|
a
|
||||||
|
2
|
||||||
|
3
|
||||||
|
delete from v1 where a=2;
|
||||||
|
select * from v1 order by a;
|
||||||
|
a
|
||||||
|
3
|
||||||
|
select * from v1 order by a;
|
||||||
|
a
|
||||||
|
3
|
||||||
|
alter view v1 as select a as b from t1;
|
||||||
|
select * from v1 order by 1;
|
||||||
|
b
|
||||||
|
3
|
||||||
|
drop view v1;
|
||||||
|
select * from v1 order by a;
|
||||||
|
ERROR 42S02: Table 'test.v1' doesn't exist
|
||||||
|
drop table t1;
|
@ -1730,3 +1730,23 @@ select * from v1 where F1 = 1;
|
|||||||
f1
|
f1
|
||||||
drop view v1;
|
drop view v1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1(c1 int);
|
||||||
|
create table t2(c2 int);
|
||||||
|
insert into t1 values (1),(2),(3);
|
||||||
|
insert into t2 values (1);
|
||||||
|
SELECT c1 FROM t1 WHERE c1 IN (SELECT c2 FROM t2);
|
||||||
|
c1
|
||||||
|
1
|
||||||
|
SELECT c1 FROM t1 WHERE EXISTS (SELECT c2 FROM t2 WHERE c2 = c1);
|
||||||
|
c1
|
||||||
|
1
|
||||||
|
create view v1 as SELECT c1 FROM t1 WHERE c1 IN (SELECT c2 FROM t2);
|
||||||
|
create view v2 as SELECT c1 FROM t1 WHERE EXISTS (SELECT c2 FROM t2 WHERE c2 = c1);
|
||||||
|
select * from v1;
|
||||||
|
c1
|
||||||
|
1
|
||||||
|
select * from v2;
|
||||||
|
c1
|
||||||
|
1
|
||||||
|
drop view v2, v1;
|
||||||
|
drop table t1, t2;
|
||||||
|
44
mysql-test/t/rpl_view.test
Normal file
44
mysql-test/t/rpl_view.test
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
source include/master-slave.inc;
|
||||||
|
--disable_warnings
|
||||||
|
drop table if exists t1,v1;
|
||||||
|
drop view if exists t1,v1;
|
||||||
|
sync_slave_with_master;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
#
|
||||||
|
# Check that createion drop of view is replicated, also check replication of
|
||||||
|
# updating of view
|
||||||
|
#
|
||||||
|
connection master;
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (1);
|
||||||
|
create view v1 as select a from t1;
|
||||||
|
insert into v1 values (2);
|
||||||
|
select * from v1 order by a;
|
||||||
|
sync_slave_with_master;
|
||||||
|
# view already have to be on slave
|
||||||
|
select * from v1 order by a;
|
||||||
|
connection master;
|
||||||
|
update v1 set a=3 where a=1;
|
||||||
|
select * from v1 order by a;
|
||||||
|
sync_slave_with_master;
|
||||||
|
select * from v1 order by a;
|
||||||
|
connection master;
|
||||||
|
delete from v1 where a=2;
|
||||||
|
select * from v1 order by a;
|
||||||
|
sync_slave_with_master;
|
||||||
|
select * from v1 order by a;
|
||||||
|
connection master;
|
||||||
|
# 'alter view' internally maped to creation, but still check that it works
|
||||||
|
alter view v1 as select a as b from t1;
|
||||||
|
sync_slave_with_master;
|
||||||
|
select * from v1 order by 1;
|
||||||
|
connection master;
|
||||||
|
drop view v1;
|
||||||
|
sync_slave_with_master;
|
||||||
|
#error, because view have to be removed from slave
|
||||||
|
-- error 1146
|
||||||
|
select * from v1 order by a;
|
||||||
|
connection master;
|
||||||
|
drop table t1;
|
||||||
|
sync_slave_with_master;
|
@ -1655,9 +1655,27 @@ select * from v3;
|
|||||||
drop view v3;
|
drop view v3;
|
||||||
drop tables t1,t2;
|
drop tables t1,t2;
|
||||||
|
|
||||||
|
#
|
||||||
# View field names should be case insensitive
|
# View field names should be case insensitive
|
||||||
|
#
|
||||||
create table t1(f1 int);
|
create table t1(f1 int);
|
||||||
create view v1 as select f1 from t1;
|
create view v1 as select f1 from t1;
|
||||||
select * from v1 where F1 = 1;
|
select * from v1 where F1 = 1;
|
||||||
drop view v1;
|
drop view v1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Resolving view fields in subqueries in VIEW (Bug #6394)
|
||||||
|
#
|
||||||
|
create table t1(c1 int);
|
||||||
|
create table t2(c2 int);
|
||||||
|
insert into t1 values (1),(2),(3);
|
||||||
|
insert into t2 values (1);
|
||||||
|
SELECT c1 FROM t1 WHERE c1 IN (SELECT c2 FROM t2);
|
||||||
|
SELECT c1 FROM t1 WHERE EXISTS (SELECT c2 FROM t2 WHERE c2 = c1);
|
||||||
|
create view v1 as SELECT c1 FROM t1 WHERE c1 IN (SELECT c2 FROM t2);
|
||||||
|
create view v2 as SELECT c1 FROM t1 WHERE EXISTS (SELECT c2 FROM t2 WHERE c2 = c1);
|
||||||
|
select * from v1;
|
||||||
|
select * from v2;
|
||||||
|
drop view v2, v1;
|
||||||
|
drop table t1, t2;
|
||||||
|
@ -5516,6 +5516,9 @@ void fill_effective_table_privileges(THD *thd, GRANT_INFO *grant,
|
|||||||
/* global privileges */
|
/* global privileges */
|
||||||
grant->privilege= thd->master_access;
|
grant->privilege= thd->master_access;
|
||||||
|
|
||||||
|
if (!thd->priv_user)
|
||||||
|
return; // it is slave
|
||||||
|
|
||||||
/* db privileges */
|
/* db privileges */
|
||||||
grant->privilege|= acl_get(thd->host, thd->ip, thd->priv_user, db, 0);
|
grant->privilege|= acl_get(thd->host, thd->ip, thd->priv_user, db, 0);
|
||||||
|
|
||||||
|
@ -4059,7 +4059,12 @@ unsent_create_error:
|
|||||||
}
|
}
|
||||||
case SQLCOM_CREATE_VIEW:
|
case SQLCOM_CREATE_VIEW:
|
||||||
{
|
{
|
||||||
res= mysql_create_view(thd, thd->lex->create_view_mode);
|
if (!(res= mysql_create_view(thd, thd->lex->create_view_mode)) &&
|
||||||
|
mysql_bin_log.is_open())
|
||||||
|
{
|
||||||
|
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
|
||||||
|
mysql_bin_log.write(&qinfo);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SQLCOM_DROP_VIEW:
|
case SQLCOM_DROP_VIEW:
|
||||||
@ -4067,7 +4072,12 @@ unsent_create_error:
|
|||||||
if (check_table_access(thd, DROP_ACL, all_tables, 0) ||
|
if (check_table_access(thd, DROP_ACL, all_tables, 0) ||
|
||||||
end_active_trans(thd))
|
end_active_trans(thd))
|
||||||
goto error;
|
goto error;
|
||||||
res= mysql_drop_view(thd, first_table, thd->lex->drop_mode);
|
if (!(res= mysql_drop_view(thd, first_table, thd->lex->drop_mode)) &&
|
||||||
|
mysql_bin_log.is_open())
|
||||||
|
{
|
||||||
|
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
|
||||||
|
mysql_bin_log.write(&qinfo);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SQLCOM_CREATE_TRIGGER:
|
case SQLCOM_CREATE_TRIGGER:
|
||||||
|
17
sql/table.cc
17
sql/table.cc
@ -1695,6 +1695,7 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds,
|
|||||||
Field_translator *transl;
|
Field_translator *transl;
|
||||||
SELECT_LEX *select= &view->select_lex;
|
SELECT_LEX *select= &view->select_lex;
|
||||||
SELECT_LEX *current_select_save= thd->lex->current_select;
|
SELECT_LEX *current_select_save= thd->lex->current_select;
|
||||||
|
byte *main_table_list_save= thd->lex->select_lex.table_list.first;
|
||||||
Item *item;
|
Item *item;
|
||||||
TABLE_LIST *tbl;
|
TABLE_LIST *tbl;
|
||||||
List_iterator_fast<Item> it(select->item_list);
|
List_iterator_fast<Item> it(select->item_list);
|
||||||
@ -1717,8 +1718,13 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds,
|
|||||||
if (field_translation)
|
if (field_translation)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("there are already translation table"));
|
DBUG_PRINT("info", ("there are already translation table"));
|
||||||
/* prevent look up in SELECTs tree */
|
/*
|
||||||
|
prevent look up in SELECTs tree, and emulate main table list by
|
||||||
|
ancestor table list for subquery processing
|
||||||
|
*/
|
||||||
thd->lex->current_select= &thd->lex->select_lex;
|
thd->lex->current_select= &thd->lex->select_lex;
|
||||||
|
thd->lex->select_lex.table_list.first= (byte *)ancestor;
|
||||||
|
|
||||||
thd->lex->select_lex.no_wrap_view_item= 1;
|
thd->lex->select_lex.no_wrap_view_item= 1;
|
||||||
thd->set_query_id= 1;
|
thd->set_query_id= 1;
|
||||||
/* this view was prepared already on previous PS/SP execution */
|
/* this view was prepared already on previous PS/SP execution */
|
||||||
@ -1763,8 +1769,13 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds,
|
|||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* prevent look up in SELECTs tree */
|
/*
|
||||||
|
prevent look up in SELECTs tree, and emulate main table list by ancestor
|
||||||
|
table list for subquery processing
|
||||||
|
*/
|
||||||
thd->lex->current_select= &thd->lex->select_lex;
|
thd->lex->current_select= &thd->lex->select_lex;
|
||||||
|
thd->lex->select_lex.table_list.first= (byte *)ancestor;
|
||||||
|
|
||||||
thd->lex->select_lex.no_wrap_view_item= 1;
|
thd->lex->select_lex.no_wrap_view_item= 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1909,6 +1920,7 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds,
|
|||||||
ok:
|
ok:
|
||||||
thd->lex->select_lex.no_wrap_view_item= save_wrapper;
|
thd->lex->select_lex.no_wrap_view_item= save_wrapper;
|
||||||
thd->lex->current_select= current_select_save;
|
thd->lex->current_select= current_select_save;
|
||||||
|
thd->lex->select_lex.table_list.first= main_table_list_save;
|
||||||
thd->set_query_id= save_set_query_id;
|
thd->set_query_id= save_set_query_id;
|
||||||
thd->allow_sum_func= save_allow_sum_func;
|
thd->allow_sum_func= save_allow_sum_func;
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
@ -1923,6 +1935,7 @@ err:
|
|||||||
}
|
}
|
||||||
thd->lex->select_lex.no_wrap_view_item= save_wrapper;
|
thd->lex->select_lex.no_wrap_view_item= save_wrapper;
|
||||||
thd->lex->current_select= current_select_save;
|
thd->lex->current_select= current_select_save;
|
||||||
|
thd->lex->select_lex.table_list.first= main_table_list_save;
|
||||||
thd->set_query_id= save_set_query_id;
|
thd->set_query_id= save_set_query_id;
|
||||||
thd->allow_sum_func= save_allow_sum_func;
|
thd->allow_sum_func= save_allow_sum_func;
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
Reference in New Issue
Block a user