From 3dcbbb7c4d790b7349449d3f751ca49f2ff22117 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Mon, 27 Mar 2006 12:02:23 +0300 Subject: [PATCH 1/6] Safer fix for Bug #18435 "5.0.19 libmysqlclient not ABI-compatible with 5.0.18" This fixes the problem if someone is using struct MYSQL as part of another structure together with a shared library --- include/mysql.h | 2 ++ sql-common/client.c | 6 ------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/include/mysql.h b/include/mysql.h index 303cb2af4f5..925a4525378 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -287,8 +287,10 @@ typedef struct st_mysql from mysql_stmt_close if close had to cancel result set of this object. */ my_bool *unbuffered_fetch_owner; +#if defined(EMBEDDED_LIBRARY) || defined(EMBEDDED_LIBRARY_COMPATIBLE) || MYSQL_VERSION_ID >= 50100 /* needed for embedded server - no net buffer to store the 'info' */ char *info_buffer; +#endif } MYSQL; typedef struct st_mysql_res { diff --git a/sql-common/client.c b/sql-common/client.c index 4c7ef3fcd03..cd50960164b 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -1428,13 +1428,7 @@ mysql_init(MYSQL *mysql) mysql->free_me=1; } else - { -#if defined(EMBEDDED_LIBRARY) || MYSQL_VERSION_ID >= 50100 bzero((char*) (mysql), sizeof(*(mysql))); -#else - bzero((char*) (mysql), offsetof(MYSQL, info_buffer)); -#endif - } mysql->options.connect_timeout= CONNECT_TIMEOUT; mysql->last_used_con= mysql->next_slave= mysql->master = mysql; mysql->charset=default_charset_info; From 35ae639477b6ecb0d31aec590b0e405627f25cf5 Mon Sep 17 00:00:00 2001 From: "kent@mysql.com" <> Date: Mon, 27 Mar 2006 19:25:25 +0200 Subject: [PATCH 2/6] mysql_config.sh: We are not to control what malloc package others are to use, remove -lmtmalloc from --libs(_r), bug#18322 --- scripts/mysql_config.sh | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/scripts/mysql_config.sh b/scripts/mysql_config.sh index 5b35c0190a5..caf8708c6a0 100644 --- a/scripts/mysql_config.sh +++ b/scripts/mysql_config.sh @@ -91,18 +91,15 @@ socket='@MYSQL_UNIX_ADDR@' port='@MYSQL_TCP_PORT@' ldflags='@LDFLAGS@' -# Create options - -libs="$ldflags -L$pkglibdir -lmysqlclient @ZLIB_DEPS@ @NON_THREADED_LIBS@" +# Create options +# We intentionally add a space to the beginning of lib strings, simplifies replace later +libs=" $ldflags -L$pkglibdir -lmysqlclient @ZLIB_DEPS@ @NON_THREADED_LIBS@" libs="$libs @openssl_libs@ @STATIC_NSS_FLAGS@" -libs=`echo "$libs" | sed -e 's; \+; ;g' | sed -e 's;^ *;;' | sed -e 's; *\$;;'` +libs_r=" $ldflags -L$pkglibdir -lmysqlclient_r @ZLIB_DEPS@ @LIBS@ @openssl_libs@" +embedded_libs=" $ldflags -L$pkglibdir -lmysqld @ZLIB_DEPS@ @LIBS@ @WRAPLIBS@ @innodb_system_libs@" -libs_r="$ldflags -L$pkglibdir -lmysqlclient_r @ZLIB_DEPS@ @LIBS@ @openssl_libs@" -libs_r=`echo "$libs_r" | sed -e 's; \+; ;g' | sed -e 's;^ *;;' | sed -e 's; *\$;;'` cflags="-I$pkgincludedir @CFLAGS@ " #note: end space! include="-I$pkgincludedir" -embedded_libs="$ldflags -L$pkglibdir -lmysqld @ZLIB_DEPS@ @LIBS@ @WRAPLIBS@ @innodb_system_libs@" -embedded_libs=`echo "$embedded_libs" | sed -e 's; \+; ;g' | sed -e 's;^ *;;' | sed -e 's; *\$;;'` # Remove some options that a client doesn't have to care about # FIXME until we have a --cxxflags, we need to remove -Xa @@ -118,6 +115,20 @@ do done cflags=`echo "$cflags"|sed -e 's/ *\$//'` +# Same for --libs(_r) +for remove in lmtmalloc +do + # We know the strings starts with a space + libs=`echo "$libs"|sed -e "s/ -$remove */ /g"` + libs_r=`echo "$libs_r"|sed -e "s/ -$remove */ /g"` + embedded_libs=`echo "$embedded_libs"|sed -e "s/ -$remove */ /g"` +done + +# Strip trailing and ending space if any, and '+' (FIXME why?) +libs=`echo "$libs" | sed -e 's; \+; ;g' | sed -e 's;^ *;;' | sed -e 's; *\$;;'` +libs_r=`echo "$libs_r" | sed -e 's; \+; ;g' | sed -e 's;^ *;;' | sed -e 's; *\$;;'` +embedded_libs=`echo "$embedded_libs" | sed -e 's; \+; ;g' | sed -e 's;^ *;;' | sed -e 's; *\$;;'` + usage () { cat < Date: Tue, 28 Mar 2006 01:01:51 +0400 Subject: [PATCH 3/6] 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/parse_file.cc | 6 ++-- sql/parse_file.h | 3 ++ sql/sql_trigger.cc | 68 +++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/sql/parse_file.cc b/sql/parse_file.cc index a57c6c02904..415465b0cd1 100644 --- a/sql/parse_file.cc +++ b/sql/parse_file.cc @@ -533,7 +533,7 @@ parse_string(char *ptr, char *end, MEM_ROOT *mem_root, LEX_STRING *str) 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 @@ read_escaped_string(char *ptr, char *eol, LEX_STRING *str) # - 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_escaped_string(char *ptr, char *end, MEM_ROOT *mem_root, LEX_STRING *str) 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 diff --git a/sql/parse_file.h b/sql/parse_file.h index 0d5a215fe1a..33871588e11 100644 --- a/sql/parse_file.h +++ b/sql/parse_file.h @@ -72,6 +72,9 @@ bool get_file_options_ulllist(char *&ptr, char *end, char *line, 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); diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 41573324082..f943b014118 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -87,7 +87,7 @@ static File_option trigname_file_parameters[]= { {(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 @@ const LEX_STRING trg_event_type_names[]= 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 @@ public: 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 @@ static TABLE_LIST *add_table_for_trigger(THD *thd, sp_name *trig) 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 @@ static TABLE_LIST *add_table_for_trigger(THD *thd, sp_name *trig) 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 @@ Handle_old_incorrect_sql_modes_hook::process_unknown_string(char *&unknown_key, 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 && @@ -1571,3 +1584,44 @@ Handle_old_incorrect_sql_modes_hook::process_unknown_string(char *&unknown_key, } 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); +} From 04f059c5bfd050ed82c0bf456dc1e4f7d6bc0937 Mon Sep 17 00:00:00 2001 From: "kent@mysql.com" <> Date: Mon, 27 Mar 2006 23:04:44 +0200 Subject: [PATCH 4/6] mysql_config.sh: Remove Solaris -xc99=none C option as C++ compiler can't handle it --- scripts/mysql_config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/mysql_config.sh b/scripts/mysql_config.sh index caf8708c6a0..4d732485b1d 100644 --- a/scripts/mysql_config.sh +++ b/scripts/mysql_config.sh @@ -107,7 +107,7 @@ include="-I$pkgincludedir" for remove in DDBUG_OFF DSAFEMALLOC USAFEMALLOC DSAFE_MUTEX \ DPEDANTIC_SAFEMALLOC DUNIV_MUST_NOT_INLINE DFORCE_INIT_OF_VARS \ DEXTRA_DEBUG DHAVE_purify 'O[0-9]' 'W[-A-Za-z]*' \ - Xa xstrconst + Xa xstrconst "xc99=none" do # The first option we might strip will always have a space before it because # we set -I$pkgincludedir as the first option From a66aace3e9c3cd6d5ff733ba0982637d62401577 Mon Sep 17 00:00:00 2001 From: "ian@zim.(none)" <> Date: Mon, 27 Mar 2006 17:45:06 -0800 Subject: [PATCH 5/6] Fix for bug #16855 --- .bzrignore | 2 ++ client/mysql.cc | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.bzrignore b/.bzrignore index e521692f6c2..f42630ae0ec 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1275,3 +1275,5 @@ zlib/*.ds? zlib/*.vcproj scripts/mysql_upgrade include/openssl +mysql-test/r/bdb.log +mysql-test/r/im_client_port.log diff --git a/client/mysql.cc b/client/mysql.cc index eb6970691bb..2001056dea1 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -653,7 +653,7 @@ static struct my_option my_long_options[] = "Base name of shared memory.", (gptr*) &shared_memory_base_name, (gptr*) &shared_memory_base_name, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"socket", 'S', "Socket file to use for connection.", + {"socket", 'S', "Socket file to use for connection. (This will override --port unless --protocol=TCP is specified.)", (gptr*) &opt_mysql_unix_port, (gptr*) &opt_mysql_unix_port, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #include "sslopt-longopts.h" @@ -939,7 +939,14 @@ static int get_options(int argc, char **argv) opt_reconnect= 0; connect_flag= 0; /* Not in interactive mode */ } - + + if (opt_mysql_port && (!opt_protocol) && (!opt_mysql_unix_port)) + { + /* Not checking return type since we are using a constant value */ + /* straight from the initialization of sql_protocol_typelib. */ + opt_protocol= find_type("TCP", &sql_protocol_typelib, 0); + } + if (strcmp(default_charset, charset_info->csname) && !(charset_info= get_charset_by_csname(default_charset, MY_CS_PRIMARY, MYF(MY_WME)))) From 8607f1df656244733f5e4d0ace0942ce6e6cec2a Mon Sep 17 00:00:00 2001 From: "ian@zim.(none)" <> Date: Mon, 27 Mar 2006 18:25:35 -0800 Subject: [PATCH 6/6] Disable udf test --- .bzrignore | 1 + mysql-test/t/disabled.def | 1 + 2 files changed, 2 insertions(+) diff --git a/.bzrignore b/.bzrignore index f42630ae0ec..1bd9f91fccf 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1277,3 +1277,4 @@ scripts/mysql_upgrade include/openssl mysql-test/r/bdb.log mysql-test/r/im_client_port.log +mysql-test/r/udf.log diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def index f71e24ff3ed..a836b1a2897 100644 --- a/mysql-test/t/disabled.def +++ b/mysql-test/t/disabled.def @@ -12,3 +12,4 @@ sp-goto : GOTO is currently is disabled - will be fixed in the future ndb_load : Bug#17233 +udf : Bug#18564 (Permission by Brian)