List:Commits« Previous MessageNext Message »
From:Marc Alff Date:August 27 2010 9:23pm
Subject:bzr commit into mysql-5.5-bugfixing branch (marc.alff:3193)
View as plain text  
#At file:///home/malff/BZR_TREE/mysql-5.5-bugfixing-55576/ based on revid:marc.alff@stripped

 3193 Marc Alff	2010-08-27 [merge]
      local merge

    removed:
      include/mysql/plugin.h.pp
    added:
      include/mysql/plugin_audit.h.pp
      include/mysql/plugin_ftparser.h.pp
      mysql-test/r/handler_read_last.result
      mysql-test/r/mysql_not_windows.result
      mysql-test/suite/perfschema/r/bad_option_3.result
      mysql-test/suite/perfschema/r/bad_option_4.result
      mysql-test/suite/perfschema/r/bad_option_5.result
      mysql-test/suite/perfschema/r/short_option_1.result
      mysql-test/suite/perfschema/r/short_option_2.result
      mysql-test/suite/perfschema/t/bad_option_3.test
      mysql-test/suite/perfschema/t/bad_option_4.test
      mysql-test/suite/perfschema/t/bad_option_5.test
      mysql-test/suite/perfschema/t/short_option_1-master.opt
      mysql-test/suite/perfschema/t/short_option_1.test
      mysql-test/suite/perfschema/t/short_option_2-master.opt
      mysql-test/suite/perfschema/t/short_option_2.test
      mysql-test/t/handler_read_last.test
      mysql-test/t/mysql_not_windows.test
    modified:
      Makefile.am
      cmake/abi_check.cmake
      cmake/do_abi_check.cmake
      mysql-test/mysql-test-run.pl
      mysql-test/r/create.result
      mysql-test/r/ctype_utf32.result
      mysql-test/r/insert_select.result
      mysql-test/r/join.result
      mysql-test/r/join_outer.result
      mysql-test/r/mysql.result
      mysql-test/r/null_key.result
      mysql-test/r/partition.result
      mysql-test/r/select.result
      mysql-test/r/single_delete_update.result
      mysql-test/r/subselect3.result
      mysql-test/r/update.result
      mysql-test/suite/ndb/r/ndb_binlog_ddl_multi.result
      mysql-test/suite/ndb/r/ndb_binlog_ignore_db.result
      mysql-test/suite/ndb/r/ndb_binlog_log_bin.result
      mysql-test/suite/ndb/r/ndb_binlog_multi.result
      mysql-test/suite/rpl_ndb/r/rpl_ndb_log.result
      mysql-test/suite/rpl_ndb/r/rpl_truncate_7ndb.result
      mysql-test/t/ctype_utf32.test
      mysql-test/t/mysql.test
      mysys/my_getopt.c
      sql/mysqld.cc
      sql/set_var.cc
      storage/myisam/mi_key.c
      storage/perfschema/pfs.cc
      storage/perfschema/pfs_stat.h
=== modified file 'Makefile.am'
--- a/Makefile.am	2010-07-29 12:32:11 +0000
+++ b/Makefile.am	2010-08-27 06:45:35 +0000
@@ -264,7 +264,8 @@ test-full-qa:
 # Headers which need to be checked for abi/api compatibility.
 #
 
-API_PREPROCESSOR_HEADER = $(top_srcdir)/include/mysql/plugin.h \
+API_PREPROCESSOR_HEADER = $(top_srcdir)/include/mysql/plugin_audit.h \
+			$(top_srcdir)/include/mysql/plugin_ftparser.h \
 			$(top_srcdir)/include/mysql.h \
 			$(top_srcdir)/include/mysql/psi/psi_abi_v1.h \
 			$(top_srcdir)/include/mysql/psi/psi_abi_v2.h

=== modified file 'cmake/abi_check.cmake'
--- a/cmake/abi_check.cmake	2010-07-20 19:53:39 +0000
+++ b/cmake/abi_check.cmake	2010-08-27 06:45:35 +0000
@@ -15,7 +15,8 @@
  
 #
 # Headers which need to be checked for abi/api compatibility are in
-# API_PREPROCESSOR_HEADER.
+# API_PREPROCESSOR_HEADER. plugin.h is tested implicitly via
+# plugin_audit.h and plugin_ftparser.h.
 #
 # We use gcc specific preprocessing command and sed/diff, so it will 
 # only be run  on Unix and only if gcc is used.
@@ -27,7 +28,8 @@ IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_SYS
     SET(COMPILER ${CMAKE_C_COMPILER})
   ENDIF()
   SET(API_PREPROCESSOR_HEADER 
-    ${CMAKE_SOURCE_DIR}/include/mysql/plugin.h
+    ${CMAKE_SOURCE_DIR}/include/mysql/plugin_audit.h
+    ${CMAKE_SOURCE_DIR}/include/mysql/plugin_ftparser.h
     ${CMAKE_SOURCE_DIR}/include/mysql.h
     ${CMAKE_SOURCE_DIR}/include/mysql/psi/psi_abi_v1.h 
     ${CMAKE_SOURCE_DIR}/include/mysql/psi/psi_abi_v2.h
@@ -38,18 +40,18 @@ IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_SYS
     -DCOMPILER=${COMPILER}
     -DSOURCE_DIR=${CMAKE_SOURCE_DIR}
     -DBINARY_DIR=${CMAKE_BINARY_DIR}
-    "-DDMYSQL_ABI_CHECK -DABI_HEADERS=${API_PREPROCESSOR_HEADER}"
+    "-DABI_HEADERS=${API_PREPROCESSOR_HEADER}"
     -P ${CMAKE_SOURCE_DIR}/cmake/do_abi_check.cmake
     VERBATIM
   )
 
   ADD_CUSTOM_TARGET(abi_check_all
   COMMAND ${CMAKE_COMMAND} 
-    -DCMAKE_C_COMPILER=${COMPILER} 
-    -DCMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR}
-    -DCMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}
-    "-DMYSQL_ABI_CHECK -DABI_HEADERS=${API_PREPROCESSOR_HEADER}"
-    -P ${CMAKE_SOURCE_DIR}/cmake/scripts/do_abi_check.cmake
+    -DCOMPILER=${COMPILER} 
+    -DSOURCE_DIR=${CMAKE_SOURCE_DIR}
+    -DBINARY_DIR=${CMAKE_BINARY_DIR}
+    "-DABI_HEADERS=${API_PREPROCESSOR_HEADER}"
+    -P ${CMAKE_SOURCE_DIR}/cmake/do_abi_check.cmake
     VERBATIM
   )
 ENDIF()

=== modified file 'cmake/do_abi_check.cmake'
--- a/cmake/do_abi_check.cmake	2009-11-09 11:32:48 +0000
+++ b/cmake/do_abi_check.cmake	2010-08-27 06:45:35 +0000
@@ -56,8 +56,9 @@ FOREACH(file ${ABI_HEADERS})
   SET(tmpfile ${file}.pp.tmp)
     EXECUTE_PROCESS(
      COMMAND ${COMPILER} 
-       -E -nostdinc -dI -I${SOURCE_DIR}/include -I${BINARY_DIR}/include 
-       -I${SOURCE_DIR}/include/mysql  -I${SOURCE_DIR}/sql  ${file} 
+       -E -nostdinc -dI -DMYSQL_ABI_CHECK -I${SOURCE_DIR}/include
+       -I${BINARY_DIR}/include -I${SOURCE_DIR}/include/mysql -I${SOURCE_DIR}/sql
+       ${file} 
        ERROR_QUIET OUTPUT_FILE ${tmpfile})
     EXECUTE_PROCESS(
       COMMAND sed -e 

=== removed file 'include/mysql/plugin.h.pp'
--- a/include/mysql/plugin.h.pp	2010-08-18 07:14:06 +0000
+++ b/include/mysql/plugin.h.pp	1970-01-01 00:00:00 +0000
@@ -1,168 +0,0 @@
-#include <mysql/services.h>
-#include <mysql/service_my_snprintf.h>
-extern struct my_snprintf_service_st {
-  size_t (*my_snprintf_type)(char*, size_t, const char*, ...);
-  size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list);
-} *my_snprintf_service;
-size_t my_snprintf(char* to, size_t n, const char* fmt, ...);
-size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap);
-#include <mysql/service_thd_alloc.h>
-struct st_mysql_lex_string
-{
-  char *str;
-  size_t length;
-};
-typedef struct st_mysql_lex_string MYSQL_LEX_STRING;
-extern struct thd_alloc_service_st {
-  void *(*thd_alloc_func)(void*, unsigned int);
-  void *(*thd_calloc_func)(void*, unsigned int);
-  char *(*thd_strdup_func)(void*, const char *);
-  char *(*thd_strmake_func)(void*, const char *, unsigned int);
-  void *(*thd_memdup_func)(void*, const void*, unsigned int);
-  MYSQL_LEX_STRING *(*thd_make_lex_string_func)(void*, MYSQL_LEX_STRING *,
-                                        const char *, unsigned int, int);
-} *thd_alloc_service;
-void *thd_alloc(void* thd, unsigned int size);
-void *thd_calloc(void* thd, unsigned int size);
-char *thd_strdup(void* thd, const char *str);
-char *thd_strmake(void* thd, const char *str, unsigned int size);
-void *thd_memdup(void* thd, const void* str, unsigned int size);
-MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str,
-                                      const char *str, unsigned int size,
-                                      int allocate_lex_string);
-struct st_mysql_xid {
-  long formatID;
-  long gtrid_length;
-  long bqual_length;
-  char data[128];
-};
-typedef struct st_mysql_xid MYSQL_XID;
-enum enum_mysql_show_type
-{
-  SHOW_UNDEF, SHOW_BOOL, SHOW_INT, SHOW_LONG,
-  SHOW_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR,
-  SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE,
-  SHOW_always_last
-};
-struct st_mysql_show_var {
-  const char *name;
-  char *value;
-  enum enum_mysql_show_type type;
-};
-typedef int (*mysql_show_var_func)(void*, struct st_mysql_show_var*, char *);
-struct st_mysql_sys_var;
-struct st_mysql_value;
-typedef int (*mysql_var_check_func)(void* thd,
-                                    struct st_mysql_sys_var *var,
-                                    void *save, struct st_mysql_value *value);
-typedef void (*mysql_var_update_func)(void* thd,
-                                      struct st_mysql_sys_var *var,
-                                      void *var_ptr, const void *save);
-struct st_mysql_plugin
-{
-  int type;
-  void *info;
-  const char *name;
-  const char *author;
-  const char *descr;
-  int license;
-  int (*init)(void *);
-  int (*deinit)(void *);
-  unsigned int version;
-  struct st_mysql_show_var *status_vars;
-  struct st_mysql_sys_var **system_vars;
-  void * __reserved1;
-};
-#include "plugin_ftparser.h"
-#include "plugin.h"
-enum enum_ftparser_mode
-{
-  MYSQL_FTPARSER_SIMPLE_MODE= 0,
-  MYSQL_FTPARSER_WITH_STOPWORDS= 1,
-  MYSQL_FTPARSER_FULL_BOOLEAN_INFO= 2
-};
-enum enum_ft_token_type
-{
-  FT_TOKEN_EOF= 0,
-  FT_TOKEN_WORD= 1,
-  FT_TOKEN_LEFT_PAREN= 2,
-  FT_TOKEN_RIGHT_PAREN= 3,
-  FT_TOKEN_STOPWORD= 4
-};
-typedef struct st_mysql_ftparser_boolean_info
-{
-  enum enum_ft_token_type type;
-  int yesno;
-  int weight_adjust;
-  char wasign;
-  char trunc;
-  char prev;
-  char *quot;
-} MYSQL_FTPARSER_BOOLEAN_INFO;
-typedef struct st_mysql_ftparser_param
-{
-  int (*mysql_parse)(struct st_mysql_ftparser_param *,
-                     char *doc, int doc_len);
-  int (*mysql_add_word)(struct st_mysql_ftparser_param *,
-                        char *word, int word_len,
-                        MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info);
-  void *ftparser_state;
-  void *mysql_ftparam;
-  struct charset_info_st *cs;
-  char *doc;
-  int length;
-  int flags;
-  enum enum_ftparser_mode mode;
-} MYSQL_FTPARSER_PARAM;
-struct st_mysql_ftparser
-{
-  int interface_version;
-  int (*parse)(MYSQL_FTPARSER_PARAM *param);
-  int (*init)(MYSQL_FTPARSER_PARAM *param);
-  int (*deinit)(MYSQL_FTPARSER_PARAM *param);
-};
-struct st_mysql_daemon
-{
-  int interface_version;
-};
-struct st_mysql_information_schema
-{
-  int interface_version;
-};
-struct st_mysql_storage_engine
-{
-  int interface_version;
-};
-struct handlerton;
- struct Mysql_replication {
-   int interface_version;
- };
-struct st_mysql_value
-{
-  int (*value_type)(struct st_mysql_value *);
-  const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length);
-  int (*val_real)(struct st_mysql_value *, double *realbuf);
-  int (*val_int)(struct st_mysql_value *, long long *intbuf);
-  int (*is_unsigned)(struct st_mysql_value *);
-};
-int thd_in_lock_tables(const void* thd);
-int thd_tablespace_op(const void* thd);
-long long thd_test_options(const void* thd, long long test_options);
-int thd_sql_command(const void* thd);
-const char *thd_proc_info(void* thd, const char *info);
-void **thd_ha_data(const void* thd, const struct handlerton *hton);
-void thd_storage_lock_wait(void* thd, long long value);
-int thd_tx_isolation(const void* thd);
-char *thd_security_context(void* thd, char *buffer, unsigned int length,
-                           unsigned int max_query_len);
-void thd_inc_row_count(void* thd);
-int mysql_tmpfile(const char *prefix);
-int thd_killed(const void* thd);
-unsigned long thd_get_thread_id(const void* thd);
-void thd_get_xid(const void* thd, MYSQL_XID *xid);
-void mysql_query_cache_invalidate4(void* thd,
-                                   const char *key, unsigned int key_length,
-                                   int using_trx);
-void *thd_get_ha_data(const void* thd, const struct handlerton *hton);
-void thd_set_ha_data(void* thd, const struct handlerton *hton,
-                     const void *ha_data);

=== added file 'include/mysql/plugin_audit.h.pp'
--- a/include/mysql/plugin_audit.h.pp	1970-01-01 00:00:00 +0000
+++ b/include/mysql/plugin_audit.h.pp	2010-08-27 06:45:35 +0000
@@ -0,0 +1,196 @@
+#include "plugin.h"
+#include <mysql/services.h>
+#include <mysql/service_my_snprintf.h>
+extern struct my_snprintf_service_st {
+  size_t (*my_snprintf_type)(char*, size_t, const char*, ...);
+  size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list);
+} *my_snprintf_service;
+size_t my_snprintf(char* to, size_t n, const char* fmt, ...);
+size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap);
+#include <mysql/service_thd_alloc.h>
+struct st_mysql_lex_string
+{
+  char *str;
+  size_t length;
+};
+typedef struct st_mysql_lex_string MYSQL_LEX_STRING;
+extern struct thd_alloc_service_st {
+  void *(*thd_alloc_func)(void*, unsigned int);
+  void *(*thd_calloc_func)(void*, unsigned int);
+  char *(*thd_strdup_func)(void*, const char *);
+  char *(*thd_strmake_func)(void*, const char *, unsigned int);
+  void *(*thd_memdup_func)(void*, const void*, unsigned int);
+  MYSQL_LEX_STRING *(*thd_make_lex_string_func)(void*, MYSQL_LEX_STRING *,
+                                        const char *, unsigned int, int);
+} *thd_alloc_service;
+void *thd_alloc(void* thd, unsigned int size);
+void *thd_calloc(void* thd, unsigned int size);
+char *thd_strdup(void* thd, const char *str);
+char *thd_strmake(void* thd, const char *str, unsigned int size);
+void *thd_memdup(void* thd, const void* str, unsigned int size);
+MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str,
+                                      const char *str, unsigned int size,
+                                      int allocate_lex_string);
+struct st_mysql_xid {
+  long formatID;
+  long gtrid_length;
+  long bqual_length;
+  char data[128];
+};
+typedef struct st_mysql_xid MYSQL_XID;
+enum enum_mysql_show_type
+{
+  SHOW_UNDEF, SHOW_BOOL, SHOW_INT, SHOW_LONG,
+  SHOW_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR,
+  SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE,
+  SHOW_always_last
+};
+struct st_mysql_show_var {
+  const char *name;
+  char *value;
+  enum enum_mysql_show_type type;
+};
+typedef int (*mysql_show_var_func)(void*, struct st_mysql_show_var*, char *);
+struct st_mysql_sys_var;
+struct st_mysql_value;
+typedef int (*mysql_var_check_func)(void* thd,
+                                    struct st_mysql_sys_var *var,
+                                    void *save, struct st_mysql_value *value);
+typedef void (*mysql_var_update_func)(void* thd,
+                                      struct st_mysql_sys_var *var,
+                                      void *var_ptr, const void *save);
+struct st_mysql_plugin
+{
+  int type;
+  void *info;
+  const char *name;
+  const char *author;
+  const char *descr;
+  int license;
+  int (*init)(void *);
+  int (*deinit)(void *);
+  unsigned int version;
+  struct st_mysql_show_var *status_vars;
+  struct st_mysql_sys_var **system_vars;
+  void * __reserved1;
+};
+#include "plugin_ftparser.h"
+#include "plugin.h"
+enum enum_ftparser_mode
+{
+  MYSQL_FTPARSER_SIMPLE_MODE= 0,
+  MYSQL_FTPARSER_WITH_STOPWORDS= 1,
+  MYSQL_FTPARSER_FULL_BOOLEAN_INFO= 2
+};
+enum enum_ft_token_type
+{
+  FT_TOKEN_EOF= 0,
+  FT_TOKEN_WORD= 1,
+  FT_TOKEN_LEFT_PAREN= 2,
+  FT_TOKEN_RIGHT_PAREN= 3,
+  FT_TOKEN_STOPWORD= 4
+};
+typedef struct st_mysql_ftparser_boolean_info
+{
+  enum enum_ft_token_type type;
+  int yesno;
+  int weight_adjust;
+  char wasign;
+  char trunc;
+  char prev;
+  char *quot;
+} MYSQL_FTPARSER_BOOLEAN_INFO;
+typedef struct st_mysql_ftparser_param
+{
+  int (*mysql_parse)(struct st_mysql_ftparser_param *,
+                     char *doc, int doc_len);
+  int (*mysql_add_word)(struct st_mysql_ftparser_param *,
+                        char *word, int word_len,
+                        MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info);
+  void *ftparser_state;
+  void *mysql_ftparam;
+  struct charset_info_st *cs;
+  char *doc;
+  int length;
+  int flags;
+  enum enum_ftparser_mode mode;
+} MYSQL_FTPARSER_PARAM;
+struct st_mysql_ftparser
+{
+  int interface_version;
+  int (*parse)(MYSQL_FTPARSER_PARAM *param);
+  int (*init)(MYSQL_FTPARSER_PARAM *param);
+  int (*deinit)(MYSQL_FTPARSER_PARAM *param);
+};
+struct st_mysql_daemon
+{
+  int interface_version;
+};
+struct st_mysql_information_schema
+{
+  int interface_version;
+};
+struct st_mysql_storage_engine
+{
+  int interface_version;
+};
+struct handlerton;
+ struct Mysql_replication {
+   int interface_version;
+ };
+struct st_mysql_value
+{
+  int (*value_type)(struct st_mysql_value *);
+  const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length);
+  int (*val_real)(struct st_mysql_value *, double *realbuf);
+  int (*val_int)(struct st_mysql_value *, long long *intbuf);
+  int (*is_unsigned)(struct st_mysql_value *);
+};
+int thd_in_lock_tables(const void* thd);
+int thd_tablespace_op(const void* thd);
+long long thd_test_options(const void* thd, long long test_options);
+int thd_sql_command(const void* thd);
+const char *thd_proc_info(void* thd, const char *info);
+void **thd_ha_data(const void* thd, const struct handlerton *hton);
+void thd_storage_lock_wait(void* thd, long long value);
+int thd_tx_isolation(const void* thd);
+char *thd_security_context(void* thd, char *buffer, unsigned int length,
+                           unsigned int max_query_len);
+void thd_inc_row_count(void* thd);
+int mysql_tmpfile(const char *prefix);
+int thd_killed(const void* thd);
+unsigned long thd_get_thread_id(const void* thd);
+void thd_get_xid(const void* thd, MYSQL_XID *xid);
+void mysql_query_cache_invalidate4(void* thd,
+                                   const char *key, unsigned int key_length,
+                                   int using_trx);
+void *thd_get_ha_data(const void* thd, const struct handlerton *hton);
+void thd_set_ha_data(void* thd, const struct handlerton *hton,
+                     const void *ha_data);
+struct mysql_event
+{
+  unsigned int event_class;
+};
+struct mysql_event_general
+{
+  unsigned int event_class;
+  unsigned int event_subclass;
+  int general_error_code;
+  unsigned long general_thread_id;
+  const char *general_user;
+  unsigned int general_user_length;
+  const char *general_command;
+  unsigned int general_command_length;
+  const char *general_query;
+  unsigned int general_query_length;
+  struct charset_info_st *general_charset;
+  unsigned long long general_time;
+  unsigned long long general_rows;
+};
+struct st_mysql_audit
+{
+  int interface_version;
+  void (*release_thd)(void*);
+  void (*event_notify)(void*, const struct mysql_event *);
+  unsigned long class_mask[1];
+};

=== added file 'include/mysql/plugin_ftparser.h.pp'
--- a/include/mysql/plugin_ftparser.h.pp	1970-01-01 00:00:00 +0000
+++ b/include/mysql/plugin_ftparser.h.pp	2010-08-27 06:45:35 +0000
@@ -0,0 +1,168 @@
+#include "plugin.h"
+#include <mysql/services.h>
+#include <mysql/service_my_snprintf.h>
+extern struct my_snprintf_service_st {
+  size_t (*my_snprintf_type)(char*, size_t, const char*, ...);
+  size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list);
+} *my_snprintf_service;
+size_t my_snprintf(char* to, size_t n, const char* fmt, ...);
+size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap);
+#include <mysql/service_thd_alloc.h>
+struct st_mysql_lex_string
+{
+  char *str;
+  size_t length;
+};
+typedef struct st_mysql_lex_string MYSQL_LEX_STRING;
+extern struct thd_alloc_service_st {
+  void *(*thd_alloc_func)(void*, unsigned int);
+  void *(*thd_calloc_func)(void*, unsigned int);
+  char *(*thd_strdup_func)(void*, const char *);
+  char *(*thd_strmake_func)(void*, const char *, unsigned int);
+  void *(*thd_memdup_func)(void*, const void*, unsigned int);
+  MYSQL_LEX_STRING *(*thd_make_lex_string_func)(void*, MYSQL_LEX_STRING *,
+                                        const char *, unsigned int, int);
+} *thd_alloc_service;
+void *thd_alloc(void* thd, unsigned int size);
+void *thd_calloc(void* thd, unsigned int size);
+char *thd_strdup(void* thd, const char *str);
+char *thd_strmake(void* thd, const char *str, unsigned int size);
+void *thd_memdup(void* thd, const void* str, unsigned int size);
+MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str,
+                                      const char *str, unsigned int size,
+                                      int allocate_lex_string);
+struct st_mysql_xid {
+  long formatID;
+  long gtrid_length;
+  long bqual_length;
+  char data[128];
+};
+typedef struct st_mysql_xid MYSQL_XID;
+enum enum_mysql_show_type
+{
+  SHOW_UNDEF, SHOW_BOOL, SHOW_INT, SHOW_LONG,
+  SHOW_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR,
+  SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE,
+  SHOW_always_last
+};
+struct st_mysql_show_var {
+  const char *name;
+  char *value;
+  enum enum_mysql_show_type type;
+};
+typedef int (*mysql_show_var_func)(void*, struct st_mysql_show_var*, char *);
+struct st_mysql_sys_var;
+struct st_mysql_value;
+typedef int (*mysql_var_check_func)(void* thd,
+                                    struct st_mysql_sys_var *var,
+                                    void *save, struct st_mysql_value *value);
+typedef void (*mysql_var_update_func)(void* thd,
+                                      struct st_mysql_sys_var *var,
+                                      void *var_ptr, const void *save);
+struct st_mysql_plugin
+{
+  int type;
+  void *info;
+  const char *name;
+  const char *author;
+  const char *descr;
+  int license;
+  int (*init)(void *);
+  int (*deinit)(void *);
+  unsigned int version;
+  struct st_mysql_show_var *status_vars;
+  struct st_mysql_sys_var **system_vars;
+  void * __reserved1;
+};
+#include "plugin_ftparser.h"
+struct st_mysql_daemon
+{
+  int interface_version;
+};
+struct st_mysql_information_schema
+{
+  int interface_version;
+};
+struct st_mysql_storage_engine
+{
+  int interface_version;
+};
+struct handlerton;
+ struct Mysql_replication {
+   int interface_version;
+ };
+struct st_mysql_value
+{
+  int (*value_type)(struct st_mysql_value *);
+  const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length);
+  int (*val_real)(struct st_mysql_value *, double *realbuf);
+  int (*val_int)(struct st_mysql_value *, long long *intbuf);
+  int (*is_unsigned)(struct st_mysql_value *);
+};
+int thd_in_lock_tables(const void* thd);
+int thd_tablespace_op(const void* thd);
+long long thd_test_options(const void* thd, long long test_options);
+int thd_sql_command(const void* thd);
+const char *thd_proc_info(void* thd, const char *info);
+void **thd_ha_data(const void* thd, const struct handlerton *hton);
+void thd_storage_lock_wait(void* thd, long long value);
+int thd_tx_isolation(const void* thd);
+char *thd_security_context(void* thd, char *buffer, unsigned int length,
+                           unsigned int max_query_len);
+void thd_inc_row_count(void* thd);
+int mysql_tmpfile(const char *prefix);
+int thd_killed(const void* thd);
+unsigned long thd_get_thread_id(const void* thd);
+void thd_get_xid(const void* thd, MYSQL_XID *xid);
+void mysql_query_cache_invalidate4(void* thd,
+                                   const char *key, unsigned int key_length,
+                                   int using_trx);
+void *thd_get_ha_data(const void* thd, const struct handlerton *hton);
+void thd_set_ha_data(void* thd, const struct handlerton *hton,
+                     const void *ha_data);
+enum enum_ftparser_mode
+{
+  MYSQL_FTPARSER_SIMPLE_MODE= 0,
+  MYSQL_FTPARSER_WITH_STOPWORDS= 1,
+  MYSQL_FTPARSER_FULL_BOOLEAN_INFO= 2
+};
+enum enum_ft_token_type
+{
+  FT_TOKEN_EOF= 0,
+  FT_TOKEN_WORD= 1,
+  FT_TOKEN_LEFT_PAREN= 2,
+  FT_TOKEN_RIGHT_PAREN= 3,
+  FT_TOKEN_STOPWORD= 4
+};
+typedef struct st_mysql_ftparser_boolean_info
+{
+  enum enum_ft_token_type type;
+  int yesno;
+  int weight_adjust;
+  char wasign;
+  char trunc;
+  char prev;
+  char *quot;
+} MYSQL_FTPARSER_BOOLEAN_INFO;
+typedef struct st_mysql_ftparser_param
+{
+  int (*mysql_parse)(struct st_mysql_ftparser_param *,
+                     char *doc, int doc_len);
+  int (*mysql_add_word)(struct st_mysql_ftparser_param *,
+                        char *word, int word_len,
+                        MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info);
+  void *ftparser_state;
+  void *mysql_ftparam;
+  struct charset_info_st *cs;
+  char *doc;
+  int length;
+  int flags;
+  enum enum_ftparser_mode mode;
+} MYSQL_FTPARSER_PARAM;
+struct st_mysql_ftparser
+{
+  int interface_version;
+  int (*parse)(MYSQL_FTPARSER_PARAM *param);
+  int (*init)(MYSQL_FTPARSER_PARAM *param);
+  int (*deinit)(MYSQL_FTPARSER_PARAM *param);
+};

=== modified file 'mysql-test/mysql-test-run.pl'
--- a/mysql-test/mysql-test-run.pl	2010-08-23 08:48:27 +0000
+++ b/mysql-test/mysql-test-run.pl	2010-08-25 13:55:22 +0000
@@ -2155,9 +2155,8 @@ sub environment_setup {
   # mysqlhotcopy
   # ----------------------------------------------------
   my $mysqlhotcopy=
-    mtr_pl_maybe_exists("$bindir/scripts/mysqlhotcopy");
-  # Since mysqltest interprets the real path as "false" in an if,
-  # use 1 ("true") to indicate "not exists" so it can be tested for
+    mtr_pl_maybe_exists("$bindir/scripts/mysqlhotcopy") ||
+    mtr_pl_maybe_exists("$path_client_bindir/mysqlhotcopy");
   if ($mysqlhotcopy)
   {
     $ENV{'MYSQLHOTCOPY'}= $mysqlhotcopy;

=== modified file 'mysql-test/r/create.result'
--- a/mysql-test/r/create.result	2010-08-18 09:35:41 +0000
+++ b/mysql-test/r/create.result	2010-08-25 19:00:38 +0000
@@ -1542,6 +1542,7 @@ show status like 'handler_read%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0

=== modified file 'mysql-test/r/ctype_utf32.result'
--- a/mysql-test/r/ctype_utf32.result	2010-08-20 11:14:11 +0000
+++ b/mysql-test/r/ctype_utf32.result	2010-08-26 12:36:33 +0000
@@ -1114,5 +1114,18 @@ format(123,2,'no_NO')
 123,00
 DROP TABLE t1;
 #
+# Bug#42511 mysqld: ctype-ucs2.c:2044: my_strnncollsp_utf32: Assertion (tlen % 4) == 0' faied
+#
+CREATE TABLE t1 (
+b char(250) CHARACTER SET utf32,
+key (b)
+) ENGINE=MYISAM;
+INSERT INTO t1 VALUES ('d'),('f');
+SELECT * FROM t1 WHERE b BETWEEN 'a' AND 'z';
+b
+d
+f
+DROP TABLE t1;
+#
 # End of 5.5 tests
 #

=== added file 'mysql-test/r/handler_read_last.result'
--- a/mysql-test/r/handler_read_last.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/r/handler_read_last.result	2010-08-25 19:00:38 +0000
@@ -0,0 +1,60 @@
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (a INT, INDEX (a));
+INSERT INTO t1 VALUES (),(),(),(),(),(),(),(),(),();
+FLUSH STATUS;
+SELECT a FROM t1 ORDER BY a LIMIT 1;
+a
+NULL
+SHOW STATUS LIKE 'HANDLER_READ%';
+Variable_name	Value
+Handler_read_first	1
+Handler_read_key	0
+Handler_read_last	0
+Handler_read_next	0
+Handler_read_prev	0
+Handler_read_rnd	0
+Handler_read_rnd_next	0
+FLUSH STATUS;
+SELECT a FROM t1 ORDER BY a DESC LIMIT 1;
+a
+NULL
+SHOW STATUS LIKE 'HANDLER_READ%';
+Variable_name	Value
+Handler_read_first	0
+Handler_read_key	0
+Handler_read_last	1
+Handler_read_next	0
+Handler_read_prev	0
+Handler_read_rnd	0
+Handler_read_rnd_next	0
+FLUSH STATUS;
+SELECT a FROM t1 ORDER BY a LIMIT 3;
+a
+NULL
+NULL
+NULL
+SHOW STATUS LIKE 'HANDLER_READ%';
+Variable_name	Value
+Handler_read_first	1
+Handler_read_key	0
+Handler_read_last	0
+Handler_read_next	2
+Handler_read_prev	0
+Handler_read_rnd	0
+Handler_read_rnd_next	0
+FLUSH STATUS;
+SELECT a FROM t1 ORDER BY a DESC LIMIT 3;
+a
+NULL
+NULL
+NULL
+SHOW STATUS LIKE 'HANDLER_READ%';
+Variable_name	Value
+Handler_read_first	0
+Handler_read_key	0
+Handler_read_last	1
+Handler_read_next	0
+Handler_read_prev	2
+Handler_read_rnd	0
+Handler_read_rnd_next	0
+DROP TABLE t1;

=== modified file 'mysql-test/r/insert_select.result'
--- a/mysql-test/r/insert_select.result	2009-09-22 21:41:37 +0000
+++ b/mysql-test/r/insert_select.result	2010-08-25 19:00:38 +0000
@@ -694,6 +694,7 @@ show status like 'Handler_read%';
 Variable_name	Value
 Handler_read_first	1
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0

=== modified file 'mysql-test/r/join.result'
--- a/mysql-test/r/join.result	2010-04-29 20:33:06 +0000
+++ b/mysql-test/r/join.result	2010-08-25 19:00:38 +0000
@@ -854,6 +854,7 @@ show status like 'Handler_read%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0

=== modified file 'mysql-test/r/join_outer.result'
--- a/mysql-test/r/join_outer.result	2010-06-01 07:57:23 +0000
+++ b/mysql-test/r/join_outer.result	2010-08-25 19:00:38 +0000
@@ -1238,6 +1238,7 @@ show status like 'Handler_read%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	5
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0

=== modified file 'mysql-test/r/mysql.result'
--- a/mysql-test/r/mysql.result	2010-08-19 11:35:47 +0000
+++ b/mysql-test/r/mysql.result	2010-08-25 08:17:15 +0000
@@ -432,8 +432,5 @@ Bug #47147: mysql client option --skip-c
 
 *************************** 1. row ***************************
 1
-Bug #54466 client 5.5 built from source lacks "pager" support
-a
-1
 
 End of tests

=== added file 'mysql-test/r/mysql_not_windows.result'
--- a/mysql-test/r/mysql_not_windows.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/r/mysql_not_windows.result	2010-08-25 08:17:15 +0000
@@ -0,0 +1,5 @@
+Bug #54466 client 5.5 built from source lacks "pager" support
+a
+1
+
+End of tests

=== modified file 'mysql-test/r/null_key.result'
--- a/mysql-test/r/null_key.result	2008-03-11 12:47:16 +0000
+++ b/mysql-test/r/null_key.result	2010-08-25 19:00:38 +0000
@@ -424,6 +424,7 @@ SHOW STATUS LIKE "handler_read%";
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	6
+Handler_read_last	0
 Handler_read_next	2
 Handler_read_prev	0
 Handler_read_rnd	0

=== modified file 'mysql-test/r/partition.result'
--- a/mysql-test/r/partition.result	2010-05-28 05:47:58 +0000
+++ b/mysql-test/r/partition.result	2010-08-25 19:00:38 +0000
@@ -359,6 +359,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	2
+Handler_read_last	0
 Handler_read_next	4
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -377,6 +378,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	2
+Handler_read_last	0
 Handler_read_next	4
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -407,6 +409,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	2
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -423,6 +426,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	2
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -439,6 +443,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	2
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -455,6 +460,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	2
 Handler_read_prev	0
 Handler_read_rnd	0

=== modified file 'mysql-test/r/select.result'
--- a/mysql-test/r/select.result	2010-07-15 13:47:50 +0000
+++ b/mysql-test/r/select.result	2010-08-25 19:00:38 +0000
@@ -4338,6 +4338,7 @@ SHOW STATUS LIKE 'Handler_read%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	2
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0

=== modified file 'mysql-test/r/single_delete_update.result'
--- a/mysql-test/r/single_delete_update.result	2010-06-22 20:32:29 +0000
+++ b/mysql-test/r/single_delete_update.result	2010-08-25 19:00:38 +0000
@@ -25,6 +25,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	4
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -41,6 +42,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	4
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -74,6 +76,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -90,6 +93,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	5
@@ -120,6 +124,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -136,6 +141,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	1
@@ -170,6 +176,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	1
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	4
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -186,6 +193,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	1
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	4
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -214,6 +222,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -230,6 +239,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	1
@@ -256,6 +266,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	1
@@ -272,6 +283,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	1
@@ -301,6 +313,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	2
+Handler_read_last	0
 Handler_read_next	7
 Handler_read_prev	0
 Handler_read_rnd	4
@@ -322,6 +335,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	2
+Handler_read_last	0
 Handler_read_next	7
 Handler_read_prev	0
 Handler_read_rnd	8
@@ -357,6 +371,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	4
 Handler_read_rnd	0
@@ -373,6 +388,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	4
 Handler_read_rnd	0
@@ -406,6 +422,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -422,6 +439,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	5
@@ -464,6 +482,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	1
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	4
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -486,6 +505,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	1
 Handler_read_next	0
 Handler_read_prev	4
 Handler_read_rnd	0
@@ -502,6 +522,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	1
 Handler_read_next	0
 Handler_read_prev	4
 Handler_read_rnd	0
@@ -536,6 +557,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	4
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -552,6 +574,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	4
 Handler_read_prev	0
 Handler_read_rnd	5
@@ -590,6 +613,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -606,6 +630,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	5
@@ -641,6 +666,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -657,6 +683,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	1
@@ -691,6 +718,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	1
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	4
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -707,6 +735,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	1
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	4
 Handler_read_prev	0
 Handler_read_rnd	5
@@ -735,6 +764,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -751,6 +781,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	1
@@ -778,6 +809,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	1
@@ -794,6 +826,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	1
@@ -824,6 +857,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	2
+Handler_read_last	0
 Handler_read_next	7
 Handler_read_prev	0
 Handler_read_rnd	4
@@ -845,6 +879,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	2
+Handler_read_last	0
 Handler_read_next	7
 Handler_read_prev	0
 Handler_read_rnd	8
@@ -884,6 +919,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	4
 Handler_read_rnd	0
@@ -900,6 +936,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	4
 Handler_read_rnd	5
@@ -938,6 +975,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -954,6 +992,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	5
@@ -990,6 +1029,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	1
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	4
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -1012,6 +1052,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	1
 Handler_read_next	0
 Handler_read_prev	4
 Handler_read_rnd	0
@@ -1028,6 +1069,7 @@ SHOW STATUS LIKE 'Handler_read_%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	1
 Handler_read_next	0
 Handler_read_prev	4
 Handler_read_rnd	5

=== modified file 'mysql-test/r/subselect3.result'
--- a/mysql-test/r/subselect3.result	2010-03-24 15:03:44 +0000
+++ b/mysql-test/r/subselect3.result	2010-08-25 19:00:38 +0000
@@ -113,6 +113,7 @@ show status like '%Handler_read%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0

=== modified file 'mysql-test/r/update.result'
--- a/mysql-test/r/update.result	2010-07-19 09:21:24 +0000
+++ b/mysql-test/r/update.result	2010-08-25 19:00:38 +0000
@@ -273,6 +273,7 @@ show status like 'handler_read%';
 Variable_name	Value
 Handler_read_first	1
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -284,6 +285,7 @@ show status like 'handler_read%';
 Variable_name	Value
 Handler_read_first	1
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	2
@@ -294,6 +296,7 @@ show status like 'handler_read%';
 Variable_name	Value
 Handler_read_first	1
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -304,6 +307,7 @@ show status like 'handler_read%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	1
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -315,6 +319,7 @@ show status like 'handler_read%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	0
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	1
@@ -368,6 +373,7 @@ show status like 'handler_read%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	1
 Handler_read_prev	0
 Handler_read_rnd	1
@@ -405,6 +411,7 @@ show status like '%Handler_read%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	1
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -415,6 +422,7 @@ show status like '%Handler_read%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	2
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -424,6 +432,7 @@ show status like '%Handler_read%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	3
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0
@@ -433,6 +442,7 @@ show status like '%Handler_read%';
 Variable_name	Value
 Handler_read_first	0
 Handler_read_key	3
+Handler_read_last	0
 Handler_read_next	0
 Handler_read_prev	0
 Handler_read_rnd	0

=== modified file 'mysql-test/suite/ndb/r/ndb_binlog_ddl_multi.result'
--- a/mysql-test/suite/ndb/r/ndb_binlog_ddl_multi.result	2007-12-19 16:16:22 +0000
+++ b/mysql-test/suite/ndb/r/ndb_binlog_ddl_multi.result	2010-08-25 14:13:20 +0000
@@ -193,4 +193,4 @@ mysqld-bin.000001	#	Table_map	2	#	table_
 mysqld-bin.000001	#	Write_rows	2	#	table_id: #
 mysqld-bin.000001	#	Write_rows	2	#	table_id: # flags: STMT_END_F
 mysqld-bin.000001	#	Query	2	#	COMMIT
-mysqld-bin.000001	#	Query	2	#	use `test`; drop table t2
+mysqld-bin.000001	#	Query	2	#	use `test`; DROP TABLE `t2` /* generated by server */

=== modified file 'mysql-test/suite/ndb/r/ndb_binlog_ignore_db.result'
--- a/mysql-test/suite/ndb/r/ndb_binlog_ignore_db.result	2007-12-19 16:16:22 +0000
+++ b/mysql-test/suite/ndb/r/ndb_binlog_ignore_db.result	2010-08-25 14:13:20 +0000
@@ -7,5 +7,5 @@ create table t1 (a int primary key, b in
 insert into t1 values (1, 1);
 show binlog events from <binlog_start>;
 Log_name	Pos	Event_type	Server_id	End_log_pos	Info
-mysqld-bin.000001	#	Query	1	#	use `test`; drop table if exists t1
+mysqld-bin.000001	#	Query	1	#	use `test`; DROP TABLE IF EXISTS `t1` /* generated by server */
 drop database mysqltest;

=== modified file 'mysql-test/suite/ndb/r/ndb_binlog_log_bin.result'
--- a/mysql-test/suite/ndb/r/ndb_binlog_log_bin.result	2007-12-19 16:16:22 +0000
+++ b/mysql-test/suite/ndb/r/ndb_binlog_log_bin.result	2010-08-25 14:13:20 +0000
@@ -47,8 +47,8 @@ mysqld-bin.000001	#	Table_map	1	#	table_
 mysqld-bin.000001	#	Write_rows	1	#	table_id: #
 mysqld-bin.000001	#	Write_rows	1	#	table_id: # flags: STMT_END_F
 mysqld-bin.000001	#	Query	1	#	COMMIT
-mysqld-bin.000001	#	Query	1	#	use `mysqltest`; drop table t1
-mysqld-bin.000001	#	Query	1	#	use `mysqltest`; drop table t2
+mysqld-bin.000001	#	Query	1	#	use `mysqltest`; DROP TABLE `t1` /* generated by server */
+mysqld-bin.000001	#	Query	1	#	use `mysqltest`; DROP TABLE `t2` /* generated by server */
 mysqld-bin.000001	#	Query	1	#	use `mysqltest`; create table t1 (d int key, e int) engine=ndb
 mysqld-bin.000001	#	Query	1	#	use `mysqltest`; create table t2 (d int key, e int) engine=ndb
 mysqld-bin.000001	#	Query	1	#	BEGIN

=== modified file 'mysql-test/suite/ndb/r/ndb_binlog_multi.result'
--- a/mysql-test/suite/ndb/r/ndb_binlog_multi.result	2007-12-19 16:16:22 +0000
+++ b/mysql-test/suite/ndb/r/ndb_binlog_multi.result	2010-08-25 14:13:20 +0000
@@ -37,7 +37,7 @@ mysqld-bin.000001	#	Table_map	1	#	table_
 mysqld-bin.000001	#	Write_rows	1	#	table_id: #
 mysqld-bin.000001	#	Write_rows	1	#	table_id: # flags: STMT_END_F
 mysqld-bin.000001	#	Query	1	#	COMMIT
-mysqld-bin.000001	#	Query	1	#	use `test`; DROP TABLE t2
+mysqld-bin.000001	#	Query	1	#	use `test`; DROP TABLE `t2` /* generated by server */
 SELECT inserts,updates,deletes,schemaops FROM 
 mysql.ndb_binlog_index WHERE epoch=<the_epoch>;
 inserts	updates	deletes	schemaops
@@ -73,7 +73,7 @@ mysqld-bin.000001	#	Table_map	2	#	table_
 mysqld-bin.000001	#	Write_rows	2	#	table_id: #
 mysqld-bin.000001	#	Write_rows	2	#	table_id: # flags: STMT_END_F
 mysqld-bin.000001	#	Query	2	#	COMMIT
-mysqld-bin.000001	#	Query	2	#	use `test`; drop table t1
+mysqld-bin.000001	#	Query	2	#	use `test`; DROP TABLE `t1` /* generated by server */
 SELECT inserts,updates,deletes,schemaops FROM
 mysql.ndb_binlog_index WHERE epoch > <the_epoch> AND epoch <= <the_epoch2>;
 inserts	updates	deletes	schemaops

=== added file 'mysql-test/suite/perfschema/r/bad_option_3.result'
--- a/mysql-test/suite/perfschema/r/bad_option_3.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/r/bad_option_3.result	2010-08-26 00:59:28 +0000
@@ -0,0 +1,2 @@
+Found: unknown option '-x'
+Found: Aborting

=== added file 'mysql-test/suite/perfschema/r/bad_option_4.result'
--- a/mysql-test/suite/perfschema/r/bad_option_4.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/r/bad_option_4.result	2010-08-26 00:59:28 +0000
@@ -0,0 +1,2 @@
+Found: Can't change dir to.*bad_option_h_param
+Found: Aborting

=== added file 'mysql-test/suite/perfschema/r/bad_option_5.result'
--- a/mysql-test/suite/perfschema/r/bad_option_5.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/r/bad_option_5.result	2010-08-26 00:59:28 +0000
@@ -0,0 +1,2 @@
+Found: unknown option '-X'
+Found: Aborting

=== added file 'mysql-test/suite/perfschema/r/short_option_1.result'
--- a/mysql-test/suite/perfschema/r/short_option_1.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/r/short_option_1.result	2010-08-26 00:59:28 +0000
@@ -0,0 +1,27 @@
+select 'Ok, the server started' as result;
+result
+Ok, the server started
+select @@SQL_MODE;
+@@SQL_MODE
+REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI
+show variables like 'sql_mode';
+Variable_name	Value
+sql_mode	REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI
+select @@character_set_server;
+@@character_set_server
+utf8
+show variables like 'character_set_system';
+Variable_name	Value
+character_set_system	utf8
+show variables like 'log';
+Variable_name	Value
+log	ON
+show variables like 'general_log';
+Variable_name	Value
+general_log	ON
+show variables like 'new';
+Variable_name	Value
+new	ON
+show variables like 'log_warnings';
+Variable_name	Value
+log_warnings	3

=== added file 'mysql-test/suite/perfschema/r/short_option_2.result'
--- a/mysql-test/suite/perfschema/r/short_option_2.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/r/short_option_2.result	2010-08-26 00:59:28 +0000
@@ -0,0 +1,9 @@
+select 'Ok, the server started' as result;
+result
+Ok, the server started
+select @@SQL_MODE;
+@@SQL_MODE
+REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI
+select @@log_warnings;
+@@log_warnings
+5

=== added file 'mysql-test/suite/perfschema/t/bad_option_3.test'
--- a/mysql-test/suite/perfschema/t/bad_option_3.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/bad_option_3.test	2010-08-26 00:59:28 +0000
@@ -0,0 +1,49 @@
+# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
+
+# Tests for PERFORMANCE_SCHEMA
+# Check error handling for invalid server start options
+
+--source include/not_embedded.inc
+--source include/have_perfschema.inc
+
+let $outfile= $MYSQLTEST_VARDIR/tmp/bad_option_3.txt;
+--error 0,1
+--remove_file $outfile
+--error 2
+--exec $MYSQLD_BOOTSTRAP_CMD --loose-console -a -x > $outfile 2>&1
+
+perl;
+    use strict;
+    use warnings;
+    my $fname= "$ENV{'MYSQLTEST_VARDIR'}/tmp/bad_option_3.txt";
+    open(FILE, "<", $fname) or die;
+    my @lines= <FILE>;
+    # those must be in the file for the test to pass
+    my @patterns=
+      ("unknown option '-x'",
+       "Aborting");
+    foreach my $one_line (@lines)
+    {
+      foreach my $one_pattern (@patterns)
+      {
+        # print pattern, not line, to get a stable output
+        print "Found: $one_pattern\n" if ($one_line =~ /$one_pattern/);
+      }
+    }
+    close FILE;
+EOF
+--remove_file $outfile
+

=== added file 'mysql-test/suite/perfschema/t/bad_option_4.test'
--- a/mysql-test/suite/perfschema/t/bad_option_4.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/bad_option_4.test	2010-08-26 00:59:28 +0000
@@ -0,0 +1,49 @@
+# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
+
+# Tests for PERFORMANCE_SCHEMA
+# Check error handling for invalid server start options
+
+--source include/not_embedded.inc
+--source include/have_perfschema.inc
+
+let $outfile= $MYSQLTEST_VARDIR/tmp/bad_option_4.txt;
+--error 0,1
+--remove_file $outfile
+--error 1
+--exec $MYSQLD_BOOTSTRAP_CMD --loose-console -a -h bad_option_h_param > $outfile 2>&1
+
+perl;
+    use strict;
+    use warnings;
+    my $fname= "$ENV{'MYSQLTEST_VARDIR'}/tmp/bad_option_4.txt";
+    open(FILE, "<", $fname) or die;
+    my @lines= <FILE>;
+    # those must be in the file for the test to pass
+    my @patterns=
+      ("Can't change dir to.*bad_option_h_param",
+       "Aborting");
+    foreach my $one_line (@lines)
+    {
+      foreach my $one_pattern (@patterns)
+      {
+        # print pattern, not line, to get a stable output
+        print "Found: $one_pattern\n" if ($one_line =~ /$one_pattern/);
+      }
+    }
+    close FILE;
+EOF
+--remove_file $outfile
+

=== added file 'mysql-test/suite/perfschema/t/bad_option_5.test'
--- a/mysql-test/suite/perfschema/t/bad_option_5.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/bad_option_5.test	2010-08-26 00:59:28 +0000
@@ -0,0 +1,52 @@
+# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
+
+# Tests for PERFORMANCE_SCHEMA
+# Check error handling for invalid server start options
+
+--source include/not_embedded.inc
+--source include/have_perfschema.inc
+
+let $outfile= $MYSQLTEST_VARDIR/tmp/bad_option_5.txt;
+--error 0,1
+--remove_file $outfile
+--error 2
+--exec $MYSQLD_BOOTSTRAP_CMD --loose-console -aXbroken > $outfile 2>&1
+
+# -aXbroken should be parsed as -a -Xbroken, or --ansi -Xbroken,
+# therefore the -X option is what the server should complain about
+
+perl;
+    use strict;
+    use warnings;
+    my $fname= "$ENV{'MYSQLTEST_VARDIR'}/tmp/bad_option_5.txt";
+    open(FILE, "<", $fname) or die;
+    my @lines= <FILE>;
+    # those must be in the file for the test to pass
+    my @patterns=
+      ("unknown option '-X'",
+       "Aborting");
+    foreach my $one_line (@lines)
+    {
+      foreach my $one_pattern (@patterns)
+      {
+        # print pattern, not line, to get a stable output
+        print "Found: $one_pattern\n" if ($one_line =~ /$one_pattern/);
+      }
+    }
+    close FILE;
+EOF
+--remove_file $outfile
+

=== added file 'mysql-test/suite/perfschema/t/short_option_1-master.opt'
--- a/mysql-test/suite/perfschema/t/short_option_1-master.opt	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/short_option_1-master.opt	2010-08-26 00:59:28 +0000
@@ -0,0 +1 @@
+-a -n -Cutf8 --collation=utf8_bin -l -T12 -W3

=== added file 'mysql-test/suite/perfschema/t/short_option_1.test'
--- a/mysql-test/suite/perfschema/t/short_option_1.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/short_option_1.test	2010-08-26 00:59:28 +0000
@@ -0,0 +1,35 @@
+# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
+
+# Tests for PERFORMANCE_SCHEMA
+# Check server start for short server start options
+
+select 'Ok, the server started' as result;
+
+# See the associated -master.opt file.
+
+select @@SQL_MODE;
+show variables like 'sql_mode';
+
+select @@character_set_server;
+show variables like 'character_set_system';
+
+show variables like 'log';
+show variables like 'general_log';
+
+show variables like 'new';
+
+show variables like 'log_warnings';
+

=== added file 'mysql-test/suite/perfschema/t/short_option_2-master.opt'
--- a/mysql-test/suite/perfschema/t/short_option_2-master.opt	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/short_option_2-master.opt	2010-08-26 00:59:28 +0000
@@ -0,0 +1 @@
+-aW5

=== added file 'mysql-test/suite/perfschema/t/short_option_2.test'
--- a/mysql-test/suite/perfschema/t/short_option_2.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/perfschema/t/short_option_2.test	2010-08-26 00:59:28 +0000
@@ -0,0 +1,29 @@
+# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
+
+# Tests for PERFORMANCE_SCHEMA
+# Check server start for short server start options
+
+select 'Ok, the server started' as result;
+
+# See the associated -master.opt file.
+# -aW5 should be parsed as -a -W5, which are two separate short options
+# stuffed inside a single argv[i] argument.
+
+# Should contain ANSI, since we started the server with -a (stands for --ansi)
+select @@SQL_MODE;
+
+# Should be 5, since we started the server with -W5
+select @@log_warnings;

=== modified file 'mysql-test/suite/rpl_ndb/r/rpl_ndb_log.result'
--- a/mysql-test/suite/rpl_ndb/r/rpl_ndb_log.result	2010-05-26 14:34:25 +0000
+++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_log.result	2010-08-25 14:13:20 +0000
@@ -25,7 +25,7 @@ master-bin.000001	#	Table_map	#	#	table_
 master-bin.000001	#	Write_rows	#	#	table_id: #
 master-bin.000001	#	Write_rows	#	#	table_id: # flags: STMT_END_F
 master-bin.000001	#	Query	#	#	COMMIT
-master-bin.000001	#	Query	#	#	use `test`; drop table t1
+master-bin.000001	#	Query	#	#	use `test`; DROP TABLE `t1` /* generated by server */
 master-bin.000001	#	Query	#	#	use `test`; create table t1 (word char(20) not null)ENGINE=NDB
 master-bin.000001	#	Query	#	#	BEGIN
 master-bin.000001	#	Table_map	#	#	table_id: # (test.t1)
@@ -204,7 +204,7 @@ master-bin.000001	#	Table_map	#	#	table_
 master-bin.000001	#	Write_rows	#	#	table_id: #
 master-bin.000001	#	Write_rows	#	#	table_id: # flags: STMT_END_F
 master-bin.000001	#	Query	#	#	COMMIT
-master-bin.000001	#	Query	#	#	use `test`; drop table t1
+master-bin.000001	#	Query	#	#	use `test`; DROP TABLE `t1` /* generated by server */
 master-bin.000001	#	Query	#	#	use `test`; create table t1 (word char(20) not null)ENGINE=NDB
 master-bin.000001	#	Query	#	#	BEGIN
 master-bin.000001	#	Table_map	#	#	table_id: # (test.t1)
@@ -240,7 +240,7 @@ slave-bin.000001	#	Table_map	#	#	table_i
 slave-bin.000001	#	Write_rows	#	#	table_id: #
 slave-bin.000001	#	Write_rows	#	#	table_id: # flags: STMT_END_F
 slave-bin.000001	#	Query	#	#	COMMIT
-slave-bin.000001	#	Query	#	#	use `test`; drop table t1
+slave-bin.000001	#	Query	#	#	use `test`; DROP TABLE `t1` /* generated by server */
 slave-bin.000001	#	Query	#	#	use `test`; create table t1 (word char(20) not null)ENGINE=NDB
 slave-bin.000001	#	Query	#	#	BEGIN
 slave-bin.000001	#	Table_map	#	#	table_id: # (test.t1)

=== modified file 'mysql-test/suite/rpl_ndb/r/rpl_truncate_7ndb.result'
--- a/mysql-test/suite/rpl_ndb/r/rpl_truncate_7ndb.result	2010-05-26 14:34:25 +0000
+++ b/mysql-test/suite/rpl_ndb/r/rpl_truncate_7ndb.result	2010-08-25 14:13:20 +0000
@@ -37,7 +37,7 @@ master-bin.000001	#	Write_rows	#	#	table
 master-bin.000001	#	Write_rows	#	#	table_id: # flags: STMT_END_F
 master-bin.000001	#	Query	#	#	COMMIT
 master-bin.000001	#	Query	#	#	use `test`; TRUNCATE TABLE t1
-master-bin.000001	#	Query	#	#	use `test`; DROP TABLE t1
+master-bin.000001	#	Query	#	#	use `test`; DROP TABLE `t1` /* generated by server */
 **** On Master ****
 CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB;
 INSERT INTO t1 VALUES (1,1), (2,2);
@@ -72,7 +72,7 @@ master-bin.000001	#	Write_rows	#	#	table
 master-bin.000001	#	Write_rows	#	#	table_id: # flags: STMT_END_F
 master-bin.000001	#	Query	#	#	COMMIT
 master-bin.000001	#	Query	#	#	use `test`; TRUNCATE TABLE t1
-master-bin.000001	#	Query	#	#	use `test`; DROP TABLE t1
+master-bin.000001	#	Query	#	#	use `test`; DROP TABLE `t1` /* generated by server */
 master-bin.000001	#	Query	#	#	use `test`; CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB
 master-bin.000001	#	Query	#	#	BEGIN
 master-bin.000001	#	Table_map	#	#	table_id: # (test.t1)
@@ -86,4 +86,4 @@ master-bin.000001	#	Table_map	#	#	table_
 master-bin.000001	#	Write_rows	#	#	table_id: #
 master-bin.000001	#	Delete_rows	#	#	table_id: # flags: STMT_END_F
 master-bin.000001	#	Query	#	#	COMMIT
-master-bin.000001	#	Query	#	#	use `test`; DROP TABLE t1
+master-bin.000001	#	Query	#	#	use `test`; DROP TABLE `t1` /* generated by server */

=== modified file 'mysql-test/t/ctype_utf32.test'
--- a/mysql-test/t/ctype_utf32.test	2010-08-20 11:14:11 +0000
+++ b/mysql-test/t/ctype_utf32.test	2010-08-26 12:36:33 +0000
@@ -819,5 +819,16 @@ SELECT * FROM t1;
 DROP TABLE t1;
 
 --echo #
+--echo # Bug#42511 mysqld: ctype-ucs2.c:2044: my_strnncollsp_utf32: Assertion (tlen % 4) == 0' faied
+--echo #
+CREATE TABLE t1 (
+ b char(250) CHARACTER SET utf32,
+ key (b)
+) ENGINE=MYISAM;
+INSERT INTO t1 VALUES ('d'),('f');
+SELECT * FROM t1 WHERE b BETWEEN 'a' AND 'z';
+DROP TABLE t1;
+
+--echo #
 --echo # End of 5.5 tests
 --echo #

=== added file 'mysql-test/t/handler_read_last.test'
--- a/mysql-test/t/handler_read_last.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/t/handler_read_last.test	2010-08-25 19:00:38 +0000
@@ -0,0 +1,40 @@
+# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+
+CREATE TABLE t1 (a INT, INDEX (a));
+INSERT INTO t1 VALUES (),(),(),(),(),(),(),(),(),();
+
+FLUSH STATUS;
+SELECT a FROM t1 ORDER BY a LIMIT 1;
+SHOW STATUS LIKE 'HANDLER_READ%';
+
+FLUSH STATUS;
+SELECT a FROM t1 ORDER BY a DESC LIMIT 1;
+SHOW STATUS LIKE 'HANDLER_READ%';
+
+FLUSH STATUS;
+SELECT a FROM t1 ORDER BY a LIMIT 3;
+SHOW STATUS LIKE 'HANDLER_READ%';
+
+FLUSH STATUS;
+SELECT a FROM t1 ORDER BY a DESC LIMIT 3;
+SHOW STATUS LIKE 'HANDLER_READ%';
+
+DROP TABLE t1;
+

=== modified file 'mysql-test/t/mysql.test'
--- a/mysql-test/t/mysql.test	2010-08-19 11:35:47 +0000
+++ b/mysql-test/t/mysql.test	2010-08-25 08:17:15 +0000
@@ -425,11 +425,5 @@ drop table t1;
 --echo
 --exec $MYSQL --skip-column-names --vertical test -e "select 1 as a"
 
-#
-# Bug #54466 client 5.5 built from source lacks "pager" support
-# 
---echo Bug #54466 client 5.5 built from source lacks "pager" support
---exec $MYSQL --pager test -e "select 1 as a"
-
 --echo
 --echo End of tests

=== added file 'mysql-test/t/mysql_not_windows.test'
--- a/mysql-test/t/mysql_not_windows.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/t/mysql_not_windows.test	2010-08-25 08:17:15 +0000
@@ -0,0 +1,15 @@
+-- source include/not_windows.inc
+# This test should work in embedded server after we fix mysqltest
+-- source include/not_embedded.inc
+#
+# Testing the MySQL command line client(mysql)
+#
+
+#
+# Bug #54466 client 5.5 built from source lacks "pager" support
+# 
+--echo Bug #54466 client 5.5 built from source lacks "pager" support
+--exec $MYSQL --pager test -e "select 1 as a"
+
+--echo
+--echo End of tests

=== modified file 'mysys/my_getopt.c'
--- a/mysys/my_getopt.c	2010-08-05 12:34:19 +0000
+++ b/mysys/my_getopt.c	2010-08-26 14:34:18 +0000
@@ -98,6 +98,49 @@ void my_getopt_register_get_addr(my_geto
   matches with one of the options in struct 'my_option'.
   Check that option was given an argument if it requires one
   Call the optional 'get_one_option()' function once for each option.
+
+  Note that handle_options() can be invoked multiple times to
+  parse a command line in several steps.
+  In this case, use the global flag @c my_getopt_skip_unknown to indicate
+  that options unknown in the current step should be preserved in the
+  command line for later parsing in subsequent steps.
+
+  For 'long' options (--a_long_option), @c my_getopt_skip_unknown is
+  fully supported. Command line parameters such as:
+  - "--a_long_option"
+  - "--a_long_option=value"
+  - "--a_long_option value"
+  will be preserved as is when the option is not known.
+
+  For 'short' options (-S), support for @c my_getopt_skip_unknown
+  comes with some limitation, because several short options
+  can also be specified together in the same command line argument,
+  as in "-XYZ".
+
+  The first use case supported is: all short options are declared.
+  handle_options() will be able to interpret "-XYZ" as one of:
+  - an unknown X option
+  - "-X -Y -Z", three short options with no arguments
+  - "-X -YZ", where Y is a short option with argument Z
+  - "-XYZ", where X is a short option with argument YZ
+  based on the full short options specifications.
+
+  The second use case supported is: no short option is declared.
+  handle_options() will reject "-XYZ" as unknown, to be parsed later.
+
+  The use case that is explicitly not supported is to provide
+  only a partial list of short options to handle_options().
+  This function can not be expected to extract some option Y
+  in the middle of the string "-XYZ" in these conditions,
+  without knowing if X will be declared an option later.
+
+  Note that this limitation only impacts parsing of several
+  short options from the same command line argument,
+  as in "mysqld -anW5".
+  When each short option is properly separated out in the command line
+  argument, for example in "mysqld -a -n -w5", the code would actually
+  work even with partial options specs given at each stage.
+
   @param [in, out] argc      command line options (count)
   @param [in, out] argv      command line options (values)
   @param [in] longopts       descriptor of all valid options
@@ -464,14 +507,40 @@ int handle_options(int *argc, char ***ar
 	  }
 	  if (!opt_found)
 	  {
-	    if (my_getopt_print_errors)
-              my_getopt_error_reporter(ERROR_LEVEL,
-                                       "%s: unknown option '-%c'", 
-                                       my_progname, *optend);
-	    return EXIT_UNKNOWN_OPTION;
+            if (my_getopt_skip_unknown)
+            {
+              /*
+                We are currently parsing a single argv[] argument
+                of the form "-XYZ".
+                One or the argument found (say Y) is not an option.
+                Hack the string "-XYZ" to make a "-YZ" substring in it,
+                and push that to the output as an unrecognized parameter.
+              */
+              DBUG_ASSERT(optend > *pos);
+              DBUG_ASSERT(optend >= cur_arg);
+              DBUG_ASSERT(optend <= *pos + strlen(*pos));
+              DBUG_ASSERT(*optend);
+              optend--;
+              optend[0]= '-'; /* replace 'X' or '-' by '-' */
+              (*argv)[argvpos++]= optend;
+              /*
+                Do not continue to parse at the current "-XYZ" argument,
+                skip to the next argv[] argument instead.
+              */
+              optend= (char*) " ";
+            }
+            else
+            {
+              if (my_getopt_print_errors)
+                my_getopt_error_reporter(ERROR_LEVEL,
+                                         "%s: unknown option '-%c'",
+                                         my_progname, *optend);
+              return EXIT_UNKNOWN_OPTION;
+            }
 	  }
 	}
-	(*argc)--; /* option handled (short), decrease argument count */
+        if (opt_found)
+          (*argc)--; /* option handled (short), decrease argument count */
 	continue;
       }
       if ((error= setval(optp, value, argument, set_maximum_value)))
@@ -479,7 +548,7 @@ int handle_options(int *argc, char ***ar
       if (get_one_option && get_one_option(optp->id, optp, argument))
         return EXIT_UNSPECIFIED_ERROR;
 
-      (*argc)--; /* option handled (short or long), decrease argument count */
+      (*argc)--; /* option handled (long), decrease argument count */
     }
     else /* non-option found */
       (*argv)[argvpos++]= cur_arg;

=== modified file 'sql/mysqld.cc'
--- a/sql/mysqld.cc	2010-08-20 08:24:32 +0000
+++ b/sql/mysqld.cc	2010-08-25 19:00:38 +0000
@@ -6439,6 +6439,7 @@ SHOW_VAR status_vars[]= {
   {"Handler_prepare",          (char*) offsetof(STATUS_VAR, ha_prepare_count),  SHOW_LONG_STATUS},
   {"Handler_read_first",       (char*) offsetof(STATUS_VAR, ha_read_first_count), SHOW_LONG_STATUS},
   {"Handler_read_key",         (char*) offsetof(STATUS_VAR, ha_read_key_count), SHOW_LONG_STATUS},
+  {"Handler_read_last",        (char*) offsetof(STATUS_VAR, ha_read_last_count), SHOW_LONG_STATUS},
   {"Handler_read_next",        (char*) offsetof(STATUS_VAR, ha_read_next_count), SHOW_LONG_STATUS},
   {"Handler_read_prev",        (char*) offsetof(STATUS_VAR, ha_read_prev_count), SHOW_LONG_STATUS},
   {"Handler_read_rnd",         (char*) offsetof(STATUS_VAR, ha_read_rnd_count), SHOW_LONG_STATUS},

=== modified file 'sql/set_var.cc'
--- a/sql/set_var.cc	2010-07-27 10:25:53 +0000
+++ b/sql/set_var.cc	2010-08-26 00:59:28 +0000
@@ -153,6 +153,17 @@ sys_var::sys_var(sys_var_chain *chain, c
   guard(lock), offset(off), on_check(on_check_func), on_update(on_update_func),
   is_os_charset(FALSE)
 {
+  /*
+    There is a limitation in handle_options() related to short options:
+    - either all short options should be declared when parsing in multiple stages,
+    - or none should be declared.
+    Because a lot of short options are used in the normal parsing phase
+    for mysqld, we enforce here that no short option is present
+    in the first (PARSE_EARLY) stage.
+    See handle_options() for details.
+  */
+  DBUG_ASSERT(parse_flag == PARSE_NORMAL || getopt_id <= 0 || getopt_id >= 255);
+
   name.str= name_arg;
   name.length= strlen(name_arg);
   DBUG_ASSERT(name.length <= NAME_CHAR_LEN);

=== modified file 'storage/myisam/mi_key.c'
--- a/storage/myisam/mi_key.c	2010-07-23 20:17:55 +0000
+++ b/storage/myisam/mi_key.c	2010-08-26 12:36:33 +0000
@@ -253,18 +253,17 @@ uint _mi_pack_key(register MI_INFO *info
     pos=old;
     if (keyseg->flag & HA_SPACE_PACK)
     {
-      uchar *end=pos+length;
       if (type == HA_KEYTYPE_NUM)
       {
-	while (pos < end && pos[0] == ' ')
-	  pos++;
+        uchar *end= pos + length;
+        while (pos < end && pos[0] == ' ')
+          pos++;
+        length= (uint) (end - pos);
       }
       else if (type != HA_KEYTYPE_BINARY)
       {
-	while (end > pos && end[-1] == ' ')
-	  end--;
+        length= cs->cset->lengthsp(cs, (char*) pos, length);
       }
-      length=(uint) (end-pos);
       FIX_LENGTH(cs, pos, length, char_length);
       store_key_length_inc(key,char_length);
       memcpy((uchar*) key,pos,(size_t) char_length);

=== modified file 'storage/perfschema/pfs.cc'
--- a/storage/perfschema/pfs.cc	2010-08-19 22:24:07 +0000
+++ b/storage/perfschema/pfs.cc	2010-08-26 15:45:25 +0000
@@ -1625,18 +1625,26 @@ static void end_mutex_wait_v1(PSI_mutex_
   if (flag_events_waits_history_long)
     insert_events_waits_history_long(wait);
 
-  if (rc == 0 && wait->m_timer_state == TIMER_STATE_TIMED)
+  if (rc == 0)
   {
     /* Thread safe: we are protected by the instrumented mutex */
-    PFS_single_stat_chain *stat;
     PFS_mutex *mutex= pfs_locker->m_target.m_mutex;
+    PFS_single_stat_chain *stat= find_per_thread_mutex_class_wait_stat(wait->m_thread, mutex->m_class);
     mutex->m_owner= wait->m_thread;
     mutex->m_last_locked= wait->m_timer_end;
 
-    ulonglong wait_time= wait->m_timer_end - wait->m_timer_start;
-    aggregate_single_stat_chain(&mutex->m_wait_stat, wait_time);
-    stat= find_per_thread_mutex_class_wait_stat(wait->m_thread, mutex->m_class);
-    aggregate_single_stat_chain(stat, wait_time);
+    /* If timed then aggregate stats, else increment the value counts only */
+    if (wait->m_timer_state == TIMER_STATE_TIMED)
+    {
+      ulonglong wait_time= wait->m_timer_end - wait->m_timer_start;
+      aggregate_single_stat_chain(&mutex->m_wait_stat, wait_time);
+      aggregate_single_stat_chain(stat, wait_time);
+    }
+    else
+    {
+      increment_single_stat_chain(&mutex->m_wait_stat);
+      increment_single_stat_chain(stat);
+    }
   }
   wait->m_thread->m_wait_locker_count--;
 }
@@ -1682,20 +1690,26 @@ static void end_rwlock_rdwait_v1(PSI_rwl
       The statistics generated are not safe, which is why they are
       just statistics, not facts.
     */
-    PFS_single_stat_chain *stat;
     PFS_rwlock *rwlock= pfs_locker->m_target.m_rwlock;
+    PFS_single_stat_chain *stat= find_per_thread_rwlock_class_wait_stat(wait->m_thread, rwlock->m_class);
+
     if (rwlock->m_readers == 0)
       rwlock->m_last_read= wait->m_timer_end;
     rwlock->m_writer= NULL;
     rwlock->m_readers++;
 
+    /* If timed then aggregate stats, else increment the value counts only */
     if (wait->m_timer_state == TIMER_STATE_TIMED)
     {
       ulonglong wait_time= wait->m_timer_end - wait->m_timer_start;
       aggregate_single_stat_chain(&rwlock->m_wait_stat, wait_time);
-      stat= find_per_thread_rwlock_class_wait_stat(wait->m_thread, rwlock->m_class);
       aggregate_single_stat_chain(stat, wait_time);
     }
+    else
+    {
+      increment_single_stat_chain(&rwlock->m_wait_stat);
+      increment_single_stat_chain(stat);
+    }
   }
   wait->m_thread->m_wait_locker_count--;
 }
@@ -1735,21 +1749,26 @@ static void end_rwlock_wrwait_v1(PSI_rwl
   if (rc == 0)
   {
     /* Thread safe : we are protected by the instrumented rwlock */
-    PFS_single_stat_chain *stat;
     PFS_rwlock *rwlock= pfs_locker->m_target.m_rwlock;
+    PFS_single_stat_chain *stat= find_per_thread_rwlock_class_wait_stat(wait->m_thread, rwlock->m_class);
     rwlock->m_writer= wait->m_thread;
     rwlock->m_last_written= wait->m_timer_end;
     /* Reset the readers stats, they could be off */
     rwlock->m_readers= 0;
     rwlock->m_last_read= 0;
 
+    /* If timed then aggregate stats, else increment the value counts only */
     if (wait->m_timer_state == TIMER_STATE_TIMED)
     {
       ulonglong wait_time= wait->m_timer_end - wait->m_timer_start;
       aggregate_single_stat_chain(&rwlock->m_wait_stat, wait_time);
-      stat= find_per_thread_rwlock_class_wait_stat(wait->m_thread, rwlock->m_class);
       aggregate_single_stat_chain(stat, wait_time);
     }
+    else
+    {
+      increment_single_stat_chain(&rwlock->m_wait_stat);
+      increment_single_stat_chain(stat);
+    }
   }
   wait->m_thread->m_wait_locker_count--;
 }
@@ -1803,16 +1822,21 @@ static void end_cond_wait_v1(PSI_cond_lo
       in condition B.
       This is accepted, the data will be slightly inaccurate.
     */
-    PFS_single_stat_chain *stat;
     PFS_cond *cond= pfs_locker->m_target.m_cond;
+    PFS_single_stat_chain *stat= find_per_thread_cond_class_wait_stat(wait->m_thread, cond->m_class);
 
+    /* If timed then aggregate stats, else increment the value counts only */
     if (wait->m_timer_state == TIMER_STATE_TIMED)
     {
       ulonglong wait_time= wait->m_timer_end - wait->m_timer_start;
       aggregate_single_stat_chain(&cond->m_wait_stat, wait_time);
-      stat= find_per_thread_cond_class_wait_stat(wait->m_thread, cond->m_class);
       aggregate_single_stat_chain(stat, wait_time);
     }
+    else
+    {
+      increment_single_stat_chain(&cond->m_wait_stat);
+      increment_single_stat_chain(stat);
+    }
   }
   wait->m_thread->m_wait_locker_count--;
 }
@@ -1855,12 +1879,18 @@ static void end_table_wait_v1(PSI_table_
   if (flag_events_waits_history_long)
     insert_events_waits_history_long(wait);
 
+  PFS_table *table= pfs_locker->m_target.m_table;
+
+  /* If timed then aggregate stats, else increment the value counts only */
   if (wait->m_timer_state == TIMER_STATE_TIMED)
   {
-    PFS_table *table= pfs_locker->m_target.m_table;
     ulonglong wait_time= wait->m_timer_end - wait->m_timer_start;
     aggregate_single_stat_chain(&table->m_wait_stat, wait_time);
   }
+  else
+  {
+    increment_single_stat_chain(&table->m_wait_stat);
+  }
 
   /*
     There is currently no per table and per thread aggregation.
@@ -1962,14 +1992,21 @@ static void end_file_wait_v1(PSI_file_lo
   if (flag_events_waits_history_long)
     insert_events_waits_history_long(wait);
 
-  PFS_single_stat_chain *stat;
   PFS_file *file= pfs_locker->m_target.m_file;
+  PFS_single_stat_chain *stat= find_per_thread_file_class_wait_stat(wait->m_thread, file->m_class);
 
-  ulonglong wait_time= wait->m_timer_end - wait->m_timer_start;
-  aggregate_single_stat_chain(&file->m_wait_stat, wait_time);
-  stat= find_per_thread_file_class_wait_stat(wait->m_thread,
-                                             file->m_class);
-  aggregate_single_stat_chain(stat, wait_time);
+  /* If timed then aggregate stats, else increment the value counts only */
+  if (wait->m_timer_state == TIMER_STATE_TIMED)
+  {
+    ulonglong wait_time= wait->m_timer_end - wait->m_timer_start;
+    aggregate_single_stat_chain(&file->m_wait_stat, wait_time);
+    aggregate_single_stat_chain(stat, wait_time);
+  }
+  else
+  {
+    increment_single_stat_chain(&file->m_wait_stat);
+    increment_single_stat_chain(stat);
+  }
 
   PFS_file_class *klass= file->m_class;
 

=== modified file 'storage/perfschema/pfs_stat.h'
--- a/storage/perfschema/pfs_stat.h	2010-07-15 23:44:45 +0000
+++ b/storage/perfschema/pfs_stat.h	2010-08-26 15:45:25 +0000
@@ -83,6 +83,22 @@ inline void aggregate_single_stat_chain(
   while (stat);
 }
 
+/**
+  Increment the value counts in a statistic chain.
+  Used for instruments that are 'ENABLED' but not 'TIMED'.
+  @param stat                         the aggregated statistic chain
+*/
+inline void increment_single_stat_chain(PFS_single_stat_chain *stat)
+{
+  do
+  {
+    if (*stat->m_control_flag)
+      stat->m_count++;
+    stat= stat->m_parent;
+  }
+  while (stat);
+}
+
 /** Statistics for COND usage. */
 struct PFS_cond_stat
 {


Attachment: [text/bzr-bundle] bzr/marc.alff@oracle.com-20100827212337-tur7mi8jbes67smw.bundle
Thread
bzr commit into mysql-5.5-bugfixing branch (marc.alff:3193) Marc Alff27 Aug