diff options
author | unknown <Li-Bing.Song@sun.com> | 2010-01-30 20:49:25 +0800 |
---|---|---|
committer | unknown <Li-Bing.Song@sun.com> | 2010-01-30 20:49:25 +0800 |
commit | d9e9a73e8f1355a24b27d64d56d555d045ee0b4c (patch) | |
tree | fe4d6d50364d61bae44bb06b36e269c34dc713ab /sql/sql_lex.h | |
parent | f51a45cdbb3c93dfd3b08fea0a6253c78f26cfae (diff) | |
download | mariadb-git-d9e9a73e8f1355a24b27d64d56d555d045ee0b4c.tar.gz |
Bug #48321 CURRENT_USER() incorrectly replicated for DROP/RENAME USER;
REVOKE/GRANT; ALTER EVENT.
The following statements support the CURRENT_USER() where a user is needed.
DROP USER
RENAME USER CURRENT_USER() ...
GRANT ... TO CURRENT_USER()
REVOKE ... FROM CURRENT_USER()
ALTER DEFINER = CURRENT_USER() EVENT
but, When these statements are binlogged, CURRENT_USER() just is binlogged
as 'CURRENT_USER()', it is not expanded to the real user name. When slave
executes the log event, 'CURRENT_USER()' is expand to the user of slave
SQL thread, but SQL thread's user name always NULL. This breaks the replication.
After this patch, All above statements are rewritten when they are binlogged.
The CURRENT_USER() is expanded to the real user's name and host.
Diffstat (limited to 'sql/sql_lex.h')
-rw-r--r-- | sql/sql_lex.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 4e4794ef2cf..99f5257eb5e 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -1727,6 +1727,8 @@ typedef struct st_lex : public Query_tables_list - CREATE TRIGGER (points to "TRIGGER"); - CREATE PROCEDURE (points to "PROCEDURE"); - CREATE FUNCTION (points to "FUNCTION" or "AGGREGATE"); + - CREATE VIEW(points to "VIEW"); + - CREATE EVENT(points to "EVENT"); This pointer is required to add possibly omitted DEFINER-clause to the DDL-statement before dumping it to the binlog. @@ -1735,6 +1737,29 @@ typedef struct st_lex : public Query_tables_list const char *stmt_definition_end; + /* + stmt_begin is intended to point to the begin of every statement. + It is now used in the following statements: + - GRANT ALL PRIVELEGES ON *.* (points to "GRANT"); + - REVOKE ALL PRIVELEGES ON *.* (points to "REVOKE"); + */ + const char *stmt_begin; + const char *stmt_end; + + /* + stmt_user_begin is intended to point to the begin of the user list in + the following statements: + - GRANT ALL PRIVELEGES ON *.* TO 'username'@'hostname' + (points to "'username'"); + - REVOKE ALL PRIVELEGES ON *.* FROM 'username'@'hostname' + (points to "'username'"); + + these pointers are required to replace the CURRENT_USER() + function by the real user before dumping it to the binlog. + */ + const char *stmt_user_begin; + const char *stmt_user_end; + /** During name resolution search only in the table list given by Name_resolution_context::first_name_resolution_table and |