mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fixed UNION support in view creation (BUG#4664)
This commit is contained in:
@ -830,7 +830,7 @@ a b c
|
|||||||
30 4 -60
|
30 4 -60
|
||||||
50 6 -100
|
50 6 -100
|
||||||
40 5 NULL
|
40 5 NULL
|
||||||
drop table t1;
|
drop table t1, t2;
|
||||||
drop view v1,v2,v3,v4,v5;
|
drop view v1,v2,v3,v4,v5;
|
||||||
create database mysqltest;
|
create database mysqltest;
|
||||||
create table mysqltest.t1 (a int, b int, primary key(a));
|
create table mysqltest.t1 (a int, b int, primary key(a));
|
||||||
@ -1040,7 +1040,6 @@ CREATE VIEW v02 AS SELECT * FROM DUAL;
|
|||||||
ERROR HY000: No tables used
|
ERROR HY000: No tables used
|
||||||
SHOW TABLES;
|
SHOW TABLES;
|
||||||
Tables_in_test table_type
|
Tables_in_test table_type
|
||||||
t2 BASE TABLE
|
|
||||||
v4 VIEW
|
v4 VIEW
|
||||||
CREATE VIEW v1 AS SELECT EXISTS (SELECT 1 UNION SELECT 2);
|
CREATE VIEW v1 AS SELECT EXISTS (SELECT 1 UNION SELECT 2);
|
||||||
select * from v1;
|
select * from v1;
|
||||||
@ -1058,3 +1057,20 @@ SHOW CREATE VIEW v1;
|
|||||||
Table Create Table
|
Table Create Table
|
||||||
v1 CREATE VIEW test.v1 AS select sql_no_cache connection_id() AS `f1`,pi() AS `f2`,current_user() AS `f3`,version() AS `f4`
|
v1 CREATE VIEW test.v1 AS select sql_no_cache connection_id() AS `f1`,pi() AS `f2`,current_user() AS `f3`,version() AS `f4`
|
||||||
drop view v1;
|
drop view v1;
|
||||||
|
create table t1 (s1 int);
|
||||||
|
create table t2 (s2 int);
|
||||||
|
insert into t1 values (1), (2);
|
||||||
|
insert into t2 values (2), (3);
|
||||||
|
create view v1 as select * from t1,t2 union all select * from t1,t2;
|
||||||
|
select * from v1;
|
||||||
|
s1 s2
|
||||||
|
1 2
|
||||||
|
2 2
|
||||||
|
1 3
|
||||||
|
2 3
|
||||||
|
1 2
|
||||||
|
2 2
|
||||||
|
1 3
|
||||||
|
2 3
|
||||||
|
drop view v1;
|
||||||
|
drop tables t1, t2;
|
||||||
|
@ -693,7 +693,7 @@ insert into v1 select c, b, a from t2;
|
|||||||
insert into v1 (z,y,x) select a+20,b+2,-100 from t2;
|
insert into v1 (z,y,x) select a+20,b+2,-100 from t2;
|
||||||
insert into v2 select b+1, a+10 from t2;
|
insert into v2 select b+1, a+10 from t2;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
drop table t1;
|
drop table t1, t2;
|
||||||
drop view v1,v2,v3,v4,v5;
|
drop view v1,v2,v3,v4,v5;
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -1004,3 +1004,15 @@ drop table t1;
|
|||||||
CREATE VIEW v1 (f1,f2,f3,f4) AS SELECT connection_id(), pi(), current_user(), version();
|
CREATE VIEW v1 (f1,f2,f3,f4) AS SELECT connection_id(), pi(), current_user(), version();
|
||||||
SHOW CREATE VIEW v1;
|
SHOW CREATE VIEW v1;
|
||||||
drop view v1;
|
drop view v1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# VIEW built over UNION
|
||||||
|
#
|
||||||
|
create table t1 (s1 int);
|
||||||
|
create table t2 (s2 int);
|
||||||
|
insert into t1 values (1), (2);
|
||||||
|
insert into t2 values (2), (3);
|
||||||
|
create view v1 as select * from t1,t2 union all select * from t1,t2;
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
drop tables t1, t2;
|
||||||
|
@ -54,7 +54,7 @@ int mysql_create_view(THD *thd,
|
|||||||
TABLE_LIST *view= lex->unlink_first_table(&link_to_local);
|
TABLE_LIST *view= lex->unlink_first_table(&link_to_local);
|
||||||
TABLE_LIST *tables= lex->query_tables;
|
TABLE_LIST *tables= lex->query_tables;
|
||||||
TABLE_LIST *tbl;
|
TABLE_LIST *tbl;
|
||||||
SELECT_LEX *select_lex= &lex->select_lex;
|
SELECT_LEX *select_lex= &lex->select_lex, *sl;
|
||||||
SELECT_LEX_UNIT *unit= &lex->unit;
|
SELECT_LEX_UNIT *unit= &lex->unit;
|
||||||
int res= 0;
|
int res= 0;
|
||||||
DBUG_ENTER("mysql_create_view");
|
DBUG_ENTER("mysql_create_view");
|
||||||
@ -74,7 +74,9 @@ int mysql_create_view(THD *thd,
|
|||||||
0, 0) ||
|
0, 0) ||
|
||||||
grant_option && check_grant(thd, CREATE_VIEW_ACL, view, 0, 1, 0))
|
grant_option && check_grant(thd, CREATE_VIEW_ACL, view, 0, 1, 0))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
for (tbl= tables; tbl; tbl= tbl->next_local)
|
for (sl= select_lex; sl; sl= sl->next_select())
|
||||||
|
{
|
||||||
|
for (tbl= sl->get_table_list(); tbl; tbl= tbl->next_local)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Ensure that we have some privilage on this table, more strict check
|
Ensure that we have some privilage on this table, more strict check
|
||||||
@ -125,6 +127,7 @@ int mysql_create_view(THD *thd,
|
|||||||
fill_effective_table_privileges(thd, &tbl->grant, tbl->db,
|
fill_effective_table_privileges(thd, &tbl->grant, tbl->db,
|
||||||
tbl->real_name);
|
tbl->real_name);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (&lex->select_lex != lex->all_selects_list)
|
if (&lex->select_lex != lex->all_selects_list)
|
||||||
{
|
{
|
||||||
@ -145,12 +148,10 @@ int mysql_create_view(THD *thd,
|
|||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
Mark fields for special privilege check (any privilege)
|
Mark fields for special privilege check (any privilege)
|
||||||
|
|
||||||
'if' should be changed if we made updateable UNION.
|
|
||||||
*/
|
*/
|
||||||
if (lex->select_lex.next_select() == 0)
|
for (sl= select_lex; sl; sl= sl->next_select())
|
||||||
{
|
{
|
||||||
List_iterator_fast<Item> it(lex->select_lex.item_list);
|
List_iterator_fast<Item> it(sl->item_list);
|
||||||
Item *item;
|
Item *item;
|
||||||
while ((item= it++))
|
while ((item= it++))
|
||||||
{
|
{
|
||||||
@ -235,9 +236,10 @@ int mysql_create_view(THD *thd,
|
|||||||
/*
|
/*
|
||||||
Compare/check grants on view with grants of underlaying tables
|
Compare/check grants on view with grants of underlaying tables
|
||||||
*/
|
*/
|
||||||
|
for (sl= select_lex; sl; sl= sl->next_select())
|
||||||
{
|
{
|
||||||
char *db= view->db ? view->db : thd->db;
|
char *db= view->db ? view->db : thd->db;
|
||||||
List_iterator_fast<Item> it(select_lex->item_list);
|
List_iterator_fast<Item> it(sl->item_list);
|
||||||
Item *item;
|
Item *item;
|
||||||
fill_effective_table_privileges(thd, &view->grant, db,
|
fill_effective_table_privileges(thd, &view->grant, db,
|
||||||
view->real_name);
|
view->real_name);
|
||||||
|
Reference in New Issue
Block a user