1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

fixed priority checking bug in sub select handling

mysql-test/r/subselect.result:
  fixed subselect test
mysql-test/t/subselect.test:
  fixed subselect test
This commit is contained in:
unknown
2003-05-28 00:49:24 +03:00
parent da9bf1dec3
commit 2029fa02c3
3 changed files with 49 additions and 13 deletions

View File

@ -606,14 +606,14 @@ x
3 3
INSERT INTO t1 (x) select (SELECT SUM(x)+2 FROM t1) FROM t2; INSERT INTO t1 (x) select (SELECT SUM(x)+2 FROM t1) FROM t2;
You can't specify target table 't1' for update in FROM clause You can't specify target table 't1' for update in FROM clause
INSERT DELAYED INTO t1 (x) VALUES ((SELECT SUM(x) FROM t2)); INSERT DELAYED INTO t1 (x) VALUES ((SELECT SUM(a) FROM t2));
select * from t1; select * from t1;
x x
1 1
2 2
3 3
3 3
0 2
drop table t1, t2, t3; drop table t1, t2, t3;
CREATE TABLE t1 (x int not null, y int, primary key (x)); CREATE TABLE t1 (x int not null, y int, primary key (x));
create table t2 (a int); create table t2 (a int);
@ -688,6 +688,8 @@ id
2 2
INSERT INTO t2 VALUES ((SELECT * FROM t2)); INSERT INTO t2 VALUES ((SELECT * FROM t2));
You can't specify target table 't2' for update in FROM clause You can't specify target table 't2' for update in FROM clause
INSERT INTO t2 VALUES ((SELECT id FROM t2));
You can't specify target table 't2' for update in FROM clause
SELECT * FROM t2; SELECT * FROM t2;
id id
1 1

View File

@ -351,7 +351,7 @@ INSERT INTO t1 (x) select (SELECT SUM(a)+1 FROM t2) FROM t2;
select * from t1; select * from t1;
-- error 1093 -- error 1093
INSERT INTO t1 (x) select (SELECT SUM(x)+2 FROM t1) FROM t2; INSERT INTO t1 (x) select (SELECT SUM(x)+2 FROM t1) FROM t2;
INSERT DELAYED INTO t1 (x) VALUES ((SELECT SUM(x) FROM t2)); INSERT DELAYED INTO t1 (x) VALUES ((SELECT SUM(a) FROM t2));
-- sleep 1 -- sleep 1
select * from t1; select * from t1;
drop table t1, t2, t3; drop table t1, t2, t3;

View File

@ -2285,15 +2285,23 @@ mysql_execute_command(THD *thd)
TABLE_LIST *table; TABLE_LIST *table;
if (check_db_used(thd,tables)) if (check_db_used(thd,tables))
goto error; goto error;
for (table=tables ; table ; table=table->next)
if (check_access(thd,UPDATE_ACL,tables->db,&tables->grant.privilege))
goto error;
{ {
if (table->derived) // Show only 1 table for check_grant
table->grant.privilege= SELECT_ACL; TABLE_LIST *subselects_tables= tables->next;
else if (check_access(thd,UPDATE_ACL,table->db,&table->grant.privilege)) tables->next= 0;
if (grant_option && check_grant(thd, UPDATE_ACL, tables))
goto error;
tables->next= subselects_tables;
// check rights on tables of subselect (if exists)
if (subselects_tables &&
(res= check_table_access(thd, SELECT_ACL, subselects_tables)))
goto error; goto error;
} }
if (grant_option && check_grant(thd,UPDATE_ACL,tables))
goto error;
if (select_lex->item_list.elements != lex->value_list.elements) if (select_lex->item_list.elements != lex->value_list.elements)
{ {
send_error(thd,ER_WRONG_VALUE_COUNT); send_error(thd,ER_WRONG_VALUE_COUNT);
@ -2349,8 +2357,21 @@ mysql_execute_command(THD *thd)
INSERT_ACL | DELETE_ACL : INSERT_ACL | update); INSERT_ACL | DELETE_ACL : INSERT_ACL | update);
if (check_access(thd,privilege,tables->db,&tables->grant.privilege)) if (check_access(thd,privilege,tables->db,&tables->grant.privilege))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
if (grant_option && check_grant(thd,privilege,tables))
goto error; {
// Show only 1 table for check_grant
TABLE_LIST *subselects_tables= tables->next;
tables->next= 0;
if (grant_option && check_grant(thd, privilege, tables))
goto error;
tables->next= subselects_tables;
// check rights on tables of subselect (if exists)
if (subselects_tables &&
(res= check_table_access(thd, SELECT_ACL, subselects_tables)))
goto error;
}
if (select_lex->item_list.elements != lex->value_list.elements) if (select_lex->item_list.elements != lex->value_list.elements)
{ {
send_error(thd,ER_WRONG_VALUE_COUNT); send_error(thd,ER_WRONG_VALUE_COUNT);
@ -2434,8 +2455,21 @@ mysql_execute_command(THD *thd)
{ {
if (check_access(thd,DELETE_ACL,tables->db,&tables->grant.privilege)) if (check_access(thd,DELETE_ACL,tables->db,&tables->grant.privilege))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
if (grant_option && check_grant(thd,DELETE_ACL,tables))
goto error; {
// Show only 1 table for check_grant
TABLE_LIST *subselects_tables= tables->next;
tables->next= 0;
if (grant_option && check_grant(thd, DELETE_ACL, tables))
goto error;
tables->next= subselects_tables;
// check rights on tables of subselect (if exists)
if (subselects_tables &&
(res= check_table_access(thd, SELECT_ACL, subselects_tables)))
goto error;
}
// Set privilege for the WHERE clause // Set privilege for the WHERE clause
tables->grant.want_privilege=(SELECT_ACL & ~tables->grant.privilege); tables->grant.want_privilege=(SELECT_ACL & ~tables->grant.privilege);
res = mysql_delete(thd,tables, select_lex->where, res = mysql_delete(thd,tables, select_lex->where,