From: Date: March 27 2006 11:01pm Subject: bk commit into 5.0 tree (anozdrin:1.2098) BUG#15921 List-Archive: http://lists.mysql.com/commits/4208 X-Bug: 15921 Message-Id: <20060327210158.19A312E567@booka.home> Below is the list of changes that have just been committed into a local 5.0 repository of alik. When alik does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet 1.2098 06/03/28 01:01:51 anozdrin@stripped +3 -0 Fix for BUG#15921: DROP TRIGGER - can't be drop trigger created in older version. The problem is that TRN-files created in "old" versions contain junk in trigger_table field, which is not acceptable in "new" versions. sql/sql_trigger.cc 1.49 06/03/28 01:01:48 anozdrin@stripped +61 -7 1. Polishing 2. Removed declaration of global handle_old_incorrect_sql_modes() since it is not used anymore. 3. Added a hook to support invalid "trigger_table" field in TRN-file from old versions. sql/parse_file.h 1.12 06/03/28 01:01:47 anozdrin@stripped +3 -0 Made parse_escaped_string() available globally. sql/parse_file.cc 1.20 06/03/28 01:01:47 anozdrin@stripped +3 -3 1. Made parse_escaped_string() available globally; 2. Polishing: fixing the comments. # This is a BitKeeper patch. What follows are the unified diffs for the # set of deltas contained in the patch. The rest of the patch, the part # that BitKeeper cares about, is below these diffs. # User: anozdrin # Host: booka.home # Root: /mnt/hda4/home/alik/MySQL/devel/5.0-rt-bug15921 --- 1.19/sql/parse_file.cc 2006-03-23 00:37:28 +03:00 +++ 1.20/sql/parse_file.cc 2006-03-28 01:01:47 +04:00 @@ -533,7 +533,7 @@ read escaped string from ptr to eol in already allocated str SYNOPSIS - parse_escaped_string() + read_escaped_string() ptr - pointer on string beginning eol - pointer on character after end of string str - target string @@ -604,7 +604,7 @@ # - pointer on symbol after string */ -static char * +char * parse_escaped_string(char *ptr, char *end, MEM_ROOT *mem_root, LEX_STRING *str) { char *eol= strchr(ptr, '\n'); @@ -622,7 +622,7 @@ parse '' delimited escaped string SYNOPSIS - parse_escaped_string() + parse_quoted_escaped_string() ptr - pointer on string beginning end - pointer on symbol after parsed string end (still owned by buffer and can be accessed --- 1.11/sql/parse_file.h 2006-02-25 18:46:26 +03:00 +++ 1.12/sql/parse_file.h 2006-03-28 01:01:47 +04:00 @@ -72,6 +72,9 @@ gptr base, File_option *parameter, MEM_ROOT *mem_root); +char * +parse_escaped_string(char *ptr, char *end, MEM_ROOT *mem_root, LEX_STRING *str); + class File_parser; File_parser *sql_parse_prepare(const LEX_STRING *file_name, MEM_ROOT *mem_root, bool bad_format_errors); --- 1.48/sql/sql_trigger.cc 2006-03-24 14:58:13 +03:00 +++ 1.49/sql/sql_trigger.cc 2006-03-28 01:01:48 +04:00 @@ -87,7 +87,7 @@ { {(char *) STRING_WITH_LEN("trigger_table")}, offsetof(struct st_trigname, trigger_table), - FILE_OPTIONS_ESTRING + FILE_OPTIONS_ESTRING }, { { 0, 0 }, 0, FILE_OPTIONS_STRING } }; @@ -109,10 +109,6 @@ static TABLE_LIST *add_table_for_trigger(THD *thd, sp_name *trig); -bool handle_old_incorrect_sql_modes(char *&unknown_key, gptr base, - MEM_ROOT *mem_root, - char *end, gptr hook_data); - class Handle_old_incorrect_sql_modes_hook: public Unknown_key_hook { private: @@ -125,6 +121,20 @@ MEM_ROOT *mem_root, char *end); }; +class Handle_old_incorrect_trigger_table_hook: public Unknown_key_hook +{ +public: + Handle_old_incorrect_trigger_table_hook(char *file_path, + LEX_STRING *trigger_table_arg) + :path(file_path), trigger_table_value(trigger_table_arg) + {}; + virtual bool process_unknown_string(char *&unknown_key, gptr base, + MEM_ROOT *mem_root, char *end); +private: + char *path; + LEX_STRING *trigger_table_value; +}; + /* Create or drop trigger for table. @@ -1130,6 +1140,9 @@ LEX_STRING path; File_parser *parser; struct st_trigname trigname; + Handle_old_incorrect_trigger_table_hook trigger_table_hook( + path_buff, &trigname.trigger_table); + DBUG_ENTER("add_table_for_trigger"); strxnmov(path_buff, FN_REFLEN, mysql_data_home, "/", trig->m_db.str, "/", @@ -1155,7 +1168,7 @@ if (parser->parse((gptr)&trigname, thd->mem_root, trigname_file_parameters, 1, - &file_parser_dummy_hook)) + &trigger_table_hook)) DBUG_RETURN(0); /* We need to reset statement table list to be PS/SP friendly. */ @@ -1542,7 +1555,7 @@ MEM_ROOT *mem_root, char *end) { - DBUG_ENTER("handle_old_incorrect_sql_modes"); + DBUG_ENTER("Handle_old_incorrect_sql_modes_hook::process_unknown_string"); DBUG_PRINT("info", ("unknown key:%60s", unknown_key)); if (unknown_key + INVALID_SQL_MODES_LENGTH + 1 < end && @@ -1567,6 +1580,47 @@ 1) to avoid problem with \0 in the junk after sql_modes 2) to speed up skipping this line by parser. */ + unknown_key= ptr-1; + } + DBUG_RETURN(FALSE); +} + +/* + Trigger BUG#15921 compatibility hook. For details see + Handle_old_incorrect_sql_modes_hook::process_unknown_string(). +*/ + +#define INVALID_TRIGGER_TABLE_LENGTH 15 + +bool +Handle_old_incorrect_trigger_table_hook:: +process_unknown_string(char *&unknown_key, gptr base, MEM_ROOT *mem_root, + char *end) +{ + DBUG_ENTER("Handle_old_incorrect_trigger_table_hook::process_unknown_string"); + DBUG_PRINT("info", ("unknown key:%60s", unknown_key)); + + if (unknown_key + INVALID_TRIGGER_TABLE_LENGTH + 1 < end && + unknown_key[INVALID_TRIGGER_TABLE_LENGTH] == '=' && + !memcmp(unknown_key, STRING_WITH_LEN("trigger_table"))) + { + char *ptr= unknown_key + INVALID_TRIGGER_TABLE_LENGTH + 1; + + DBUG_PRINT("info", ("trigger_table affected by BUG#15921 detected")); + push_warning_printf(current_thd, + MYSQL_ERROR::WARN_LEVEL_NOTE, + ER_OLD_FILE_FORMAT, + ER(ER_OLD_FILE_FORMAT), + (char *)path, "TRIGGER"); + + if (!(ptr= parse_escaped_string(ptr, end, mem_root, trigger_table_value))) + { + my_error(ER_FPARSER_ERROR_IN_PARAMETER, MYF(0), "trigger_table", + unknown_key); + DBUG_RETURN(TRUE); + } + + /* Set parsing pointer to the last symbol of string (\n). */ unknown_key= ptr-1; } DBUG_RETURN(FALSE);