diff --git a/mysql-test/r/grant.result b/mysql-test/r/grant.result index 0df3ac6de8a..579c3fa9232 100644 --- a/mysql-test/r/grant.result +++ b/mysql-test/r/grant.result @@ -1283,4 +1283,26 @@ CALL mysqltest1.test(); DROP DATABASE mysqltest1; RENAME TABLE mysql.procs_gone TO mysql.procs_priv; FLUSH PRIVILEGES; -End of 5.1 tests + +drop table if exists test; +Warnings: +Note 1051 Unknown table 'test' +drop function if exists test_function; +Warnings: +Note 1305 FUNCTION test_function does not exist +drop view if exists v1; +Warnings: +Note 1051 Unknown table 'test.v1' +create table test (col1 varchar(30)); +create function test_function() returns varchar(30) +begin +declare tmp varchar(30); +select col1 from test limit 1 into tmp; +return '1'; +end| +create view v1 as select test.* from test where test.col1=test_function(); +grant update (col1) on v1 to 'greg'; +revoke all privileges on v1 from 'greg'; +drop view v1; +drop table test; +drop function test_function; diff --git a/mysql-test/t/grant.test b/mysql-test/t/grant.test index 16cccd1a1f4..e3c7d44ea5c 100644 --- a/mysql-test/t/grant.test +++ b/mysql-test/t/grant.test @@ -1266,6 +1266,28 @@ DROP DATABASE db27878; use test; DROP TABLE t1; +# +# Bug #33201 Crash occurs when granting update privilege on one column of a view +# +drop table if exists test; +drop function if exists test_function; +drop view if exists v1; +create table test (col1 varchar(30)); +delimiter |; +create function test_function() returns varchar(30) +begin + declare tmp varchar(30); + select col1 from test limit 1 into tmp; + return '1'; +end| +delimiter ;| +create view v1 as select test.* from test where test.col1=test_function(); +grant update (col1) on v1 to 'greg'; +revoke all privileges on v1 from 'greg'; +drop view v1; +drop table test; +drop function test_function; + --echo End of 5.0 tests # diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index d2d26da229a..7e66db9a816 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -3041,6 +3041,12 @@ bool mysql_table_grant(THD *thd, TABLE_LIST *table_list, } #endif + /* + The lock api is depending on the thd->lex variable which needs to be + re-initialized. + */ + Query_tables_list backup; + thd->lex->reset_n_backup_query_tables_list(&backup); if (simple_open_n_lock_tables(thd,tables)) { // Should never happen close_thread_tables(thd); /* purecov: deadcode */ @@ -3173,6 +3179,7 @@ bool mysql_table_grant(THD *thd, TABLE_LIST *table_list, send_ok(thd); /* Tables are automatically closed */ + thd->lex->restore_backup_query_tables_list(&backup); DBUG_RETURN(result); }