mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fix spurious permissions problem when CONVERT_TZ() is used
in a multi-table update query. (Bug #9979) mysql-test/r/timezone_grant.result: Add new results mysql-test/t/timezone_grant.test: Add new test sql/sql_parse.cc: Make sure to check lex->time_zone_tables_used to determine if we are using additional tables.
This commit is contained in:
@ -45,6 +45,13 @@ select * from mysql.time_zone_name;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 'time_zone_name'
|
||||
select Name, convert_tz('2004-11-30 12:00:00', Name, 'UTC') from mysql.time_zone_name;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 'time_zone_name'
|
||||
drop table t1, t2;
|
||||
create table t1 (a int, b datetime);
|
||||
create table t2 (a int, b varchar(40));
|
||||
update t1 set b = '2005-01-01 10:00';
|
||||
update t1 set b = convert_tz(b, 'UTC', 'UTC');
|
||||
update t1 join t2 on (t1.a = t2.a) set t1.b = '2005-01-01 10:00' where t2.b = 'foo';
|
||||
update t1 join t2 on (t1.a = t2.a) set t1.b = convert_tz('2005-01-01 10:00','UTC','UTC') where t2.b = 'foo';
|
||||
delete from mysql.user where user like 'mysqltest\_%';
|
||||
delete from mysql.db where user like 'mysqltest\_%';
|
||||
delete from mysql.tables_priv where user like 'mysqltest\_%';
|
||||
|
@ -61,6 +61,18 @@ select * from mysql.time_zone_name;
|
||||
--error 1142
|
||||
select Name, convert_tz('2004-11-30 12:00:00', Name, 'UTC') from mysql.time_zone_name;
|
||||
|
||||
#
|
||||
# Bug #9979: Use of CONVERT_TZ in multiple-table UPDATE causes bogus
|
||||
# privilege error
|
||||
#
|
||||
drop table t1, t2;
|
||||
create table t1 (a int, b datetime);
|
||||
create table t2 (a int, b varchar(40));
|
||||
update t1 set b = '2005-01-01 10:00';
|
||||
update t1 set b = convert_tz(b, 'UTC', 'UTC');
|
||||
update t1 join t2 on (t1.a = t2.a) set t1.b = '2005-01-01 10:00' where t2.b = 'foo';
|
||||
update t1 join t2 on (t1.a = t2.a) set t1.b = convert_tz('2005-01-01 10:00','UTC','UTC') where t2.b = 'foo';
|
||||
|
||||
# Clean-up
|
||||
connection default;
|
||||
delete from mysql.user where user like 'mysqltest\_%';
|
||||
|
@ -1938,7 +1938,8 @@ mysql_execute_command(THD *thd)
|
||||
that is not a SHOW command or a select that only access local
|
||||
variables, but for now this is probably good enough.
|
||||
*/
|
||||
if (tables || &lex->select_lex != lex->all_selects_list)
|
||||
if (tables || &lex->select_lex != lex->all_selects_list ||
|
||||
lex->time_zone_tables_used)
|
||||
mysql_reset_errors(thd);
|
||||
|
||||
#ifdef HAVE_REPLICATION
|
||||
@ -5354,7 +5355,7 @@ int multi_update_precheck(THD *thd, TABLE_LIST *tables)
|
||||
/*
|
||||
Is there tables of subqueries?
|
||||
*/
|
||||
if (&lex->select_lex != lex->all_selects_list)
|
||||
if (&lex->select_lex != lex->all_selects_list || lex->time_zone_tables_used)
|
||||
{
|
||||
DBUG_PRINT("info",("Checking sub query list"));
|
||||
for (table= tables; table; table= table->next)
|
||||
|
Reference in New Issue
Block a user