diff --git a/client/mysqldump.c b/client/mysqldump.c
index dbc11f1ab901197a66967fa4c17d19aff154c029..864fe38a204dab0aefbc66cd358911e139e20fcc 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -150,6 +150,9 @@ static struct my_option my_long_options[] =
   {"character-sets-dir", OPT_CHARSETS_DIR,
    "Directory where character sets are.", (gptr*) &charsets_dir,
    (gptr*) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
+  {"comments", 'i', "Write additional information.",
+   (gptr*) &opt_comments, (gptr*) &opt_comments, 0, GET_BOOL, NO_ARG,
+   1, 0, 0, 0, 0, 0},
   {"compatible", OPT_COMPATIBLE,
    "Change the dump to be compatible with a given mode. By default tables are dumped in a format optimized for MySQL. Legal modes are: ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, no_field_options. One can use several modes separated by commas. Note: Requires MySQL server version 4.1.0 or higher. This option is ignored with earlier server versions.",
    (gptr*) &opt_compatible_mode_str, (gptr*) &opt_compatible_mode_str, 0,
@@ -225,6 +228,9 @@ static struct my_option my_long_options[] =
    0, 0, 0, 0, 0, 0},
   {"help", '?', "Display this help message and exit.", 0, 0, 0, GET_NO_ARG,
    NO_ARG, 0, 0, 0, 0, 0, 0},
+  {"hex-blob", OPT_HEXBLOB, "Dump binary strings (BINARY, "
+    "VARBINARY, BLOB) in hexadecimal format.",
+   (gptr*) &opt_hex_blob, (gptr*) &opt_hex_blob, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
   {"host", 'h', "Connect to host.", (gptr*) &current_host,
    (gptr*) &current_host, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
   {"lines-terminated-by", OPT_LTB, "Lines in the i.file are terminated by ...",
@@ -344,13 +350,7 @@ static struct my_option my_long_options[] =
   {"net_buffer_length", OPT_NET_BUFFER_LENGTH, "",
     (gptr*) &opt_net_buffer_length, (gptr*) &opt_net_buffer_length, 0,
     GET_ULONG, REQUIRED_ARG, 1024*1024L-1025, 4096, 16*1024L*1024L,
-    MALLOC_OVERHEAD-1024, 1024, 0},
-  {"comments", 'i', "Write additional information.",
-   (gptr*) &opt_comments, (gptr*) &opt_comments, 0, GET_BOOL, NO_ARG,
-   1, 0, 0, 0, 0, 0},
-  {"hex-blob", OPT_HEXBLOB, "Dump BLOBs in HEX.",
-   (gptr*) &opt_hex_blob, (gptr*) &opt_hex_blob, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
-  {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
+    MALLOC_OVERHEAD-1024, 1024, 0}
 };
 
 static const char *load_default_groups[]= { "mysqldump","client",0 };
diff --git a/innobase/trx/trx0purge.c b/innobase/trx/trx0purge.c
index 6726d7ca6097659d726e399fcdfe8bc965baa3ec..5c62640e0110141e2584c8c0be563587b3fd041d 100644
--- a/innobase/trx/trx0purge.c
+++ b/innobase/trx/trx0purge.c
@@ -1069,30 +1069,6 @@ trx_purge(void)
 		}
 	}
 
-	/* Determine how much data manipulation language (DML) statements
-	need to be delayed in order to reduce the lagging of the purge
-	thread. */
-	srv_dml_needed_delay = 0; /* in microseconds; default: no delay */
-
-	/* If we cannot advance the 'purge view' because of an old
-	'consistent read view', then the DML statements cannot be delayed.
-	Also, srv_max_purge_lag <= 0 means 'infinity'. */
-	if (srv_max_purge_lag > 0
-			&& !UT_LIST_GET_LAST(trx_sys->view_list)) {
-		float	ratio = (float) trx_sys->rseg_history_len
-				/ srv_max_purge_lag;
-		if (ratio > ULINT_MAX / 10000) {
-			/* Avoid overflow: maximum delay is 4295 seconds */
-			srv_dml_needed_delay = ULINT_MAX;
-		} else if (ratio > 1) {
-			/* If the history list length exceeds the
-			innodb_max_purge_lag, the
-			data manipulation statements are delayed
-			by at least 5000 microseconds. */
-			srv_dml_needed_delay = (ulint) ((ratio - .5) * 10000);
-		}
-	}
-
 	purge_sys->view = read_view_oldest_copy_or_open_new(NULL,
 							purge_sys->heap);
 	mutex_exit(&kernel_mutex);	
diff --git a/myisam/mi_check.c b/myisam/mi_check.c
index 1df518a2712bcd3ddaae263159fd022a2e68f98b..bf684270c0ac61732800d00c021a66e76a0f60b7 100644
--- a/myisam/mi_check.c
+++ b/myisam/mi_check.c
@@ -656,6 +656,14 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
         if (chk_index_down(param,info,&info->s->ft2_keyinfo,record,
                            temp_buff,&tmp_keys,key_checksum,1))
           goto err;
+        if (tmp_keys + subkeys)
+        {
+          mi_check_print_error(param,"Number of words in the 2nd level tree "
+                                  "does not match the number in the header. "
+                                  "Parent word in on the page %s, offset %d",
+                                  llstr(page,llbuff), old_keypos-buff);
+          goto err;
+        }
         (*keys)+=tmp_keys-1;
         continue;
       }
diff --git a/myisam/mi_write.c b/myisam/mi_write.c
index dc596672a84c66d36e051f0405f2d5db2b74ca15..e059bbb569f2ca7517f04ae2f2f505c557ac322e 100644
--- a/myisam/mi_write.c
+++ b/myisam/mi_write.c
@@ -372,6 +372,7 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
         /* popular word. two-level tree. going down */
         my_off_t root=info->dupp_key_pos;
         keyinfo=&info->s->ft2_keyinfo;
+        get_key_full_length_rdonly(off, key);
         key+=off;
         keypos-=keyinfo->keylength+nod_flag; /* we'll modify key entry 'in vivo' */
         error=_mi_ck_real_write_btree(info, keyinfo, key, 0,
diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh
index fcb9e5eee2d1d6326c9e1fd4e586e9876945f67c..27eae89922c1f4faa41e9b5daf0dc240c0f483bc 100644
--- a/mysql-test/mysql-test-run.sh
+++ b/mysql-test/mysql-test-run.sh
@@ -227,7 +227,7 @@ DO_CLIENT_GDB=""
 SLEEP_TIME_AFTER_RESTART=1
 SLEEP_TIME_FOR_DELETE=10
 SLEEP_TIME_FOR_FIRST_MASTER=400		# Enough time to create innodb tables
-SLEEP_TIME_FOR_SECOND_MASTER=30
+SLEEP_TIME_FOR_SECOND_MASTER=400
 SLEEP_TIME_FOR_FIRST_SLAVE=400
 SLEEP_TIME_FOR_SECOND_SLAVE=30
 CHARACTER_SET=latin1
diff --git a/ndb/src/common/util/basestring_vsnprintf.c b/ndb/src/common/util/basestring_vsnprintf.c
index 1b4d88679c12535b7b5215db3f1dd37e41867516..8a58ca0fe5c54d23b65d8fb5493b29b34d7c77b0 100644
--- a/ndb/src/common/util/basestring_vsnprintf.c
+++ b/ndb/src/common/util/basestring_vsnprintf.c
@@ -20,6 +20,10 @@
 #include <basestring_vsnprintf.h>
 #include <my_config.h>
 
+
+/*
+  #define SNPRINTF_RETURN_TRUNC
+*/
 int
 basestring_snprintf(char *str, size_t size, const char *format, ...)
 {
@@ -47,13 +51,27 @@ static char basestring_vsnprintf_buf[16*1024];
 int
 basestring_vsnprintf(char *str, size_t size, const char *format, va_list ap)
 {
-  int ret= BASESTRING_VSNPRINTF_FUNC(str, size, format, ap);
+  if (size == 0)
+  {
 #ifdef SNPRINTF_RETURN_TRUNC
-  if (ret == size-1 || ret == -1) {
-    ret= BASESTRING_VSNPRINTF_FUNC(basestring_vsnprintf_buf,
-				   sizeof(basestring_vsnprintf_buf),
-				   format, ap);
+    return BASESTRING_VSNPRINTF_FUNC(basestring_vsnprintf_buf,
+				     sizeof(basestring_vsnprintf_buf),
+				     format, ap);
+#else
+    char buf[1];
+    return BASESTRING_VSNPRINTF_FUNC(buf, 1, format, ap);
+#endif
   }
+  {
+    int ret= BASESTRING_VSNPRINTF_FUNC(str, size, format, ap);
+#ifdef SNPRINTF_RETURN_TRUNC
+    if (ret == size-1 || ret == -1)
+    {
+      ret= BASESTRING_VSNPRINTF_FUNC(basestring_vsnprintf_buf,
+				     sizeof(basestring_vsnprintf_buf),
+				     format, ap);
+    }
 #endif
-  return ret;
+    return ret;
+  }
 }
diff --git a/ndb/tools/ndb_test_platform.cpp b/ndb/tools/ndb_test_platform.cpp
index 2b8bbd0274bb16bfe562aa26bf83a46ce49dbb77..72dd146dacdf93d3a70f031a4de5d4f945ec4f0d 100644
--- a/ndb/tools/ndb_test_platform.cpp
+++ b/ndb/tools/ndb_test_platform.cpp
@@ -32,19 +32,21 @@ int test_snprintf(const char * fmt, int buf_sz, int result)
   
   if(ret < 0)
   {
-    printf("BaseString::snprint returns %d\n", ret);
+    printf("BaseString::snprint returns %d with size=%d and strlen(fmt)=%d\n",
+	   ret, buf_sz, strlen(fmt));
     return -1;
   }
   
   if(ret+1 == buf_sz)
   {
-    printf("BaseString::snprint truncates\n");
+    printf("BaseString::snprint truncates returns %d with size=%d and strlen(fmt)=%d\n",
+	   ret, buf_sz, strlen(fmt));
     return -1;
   }
   
   if(ret != result)
   {
-    printf("BaseString::snprint returns incorrect value: %d != %d\n",
+    printf("BaseString::snprint returns incorrect value: returned=%d != expected=%d\n",
 	   ret, result);
     return -1;
   }
@@ -54,7 +56,7 @@ int test_snprintf(const char * fmt, int buf_sz, int result)
     if(buf[ret] != fmt[ret])
     {
       printf("BaseString::snprint Incorrect value in output buffer: "
-	     "%d %d %d %d %d\n",
+	     "size=%d returned=expected=%d at pos=%d result=%d  != expected=%d\n",
              buf_sz, result, ret, buf[ret], fmt[ret]);
       return -1;
     }
diff --git a/ndb/tools/waiter.cpp b/ndb/tools/waiter.cpp
index c9e76bb8ed3b9d13f483cb3304e5de8d23059e0d..be572d7c27563ab160c8e4ea2efc984b1c2ada91 100644
--- a/ndb/tools/waiter.cpp
+++ b/ndb/tools/waiter.cpp
@@ -86,7 +86,7 @@ int main(int argc, char** argv){
 
   if (_hostName == NULL){
     LocalConfig lcfg;
-    if(!lcfg.init())
+    if(!lcfg.init(opt_connect_str, 0))
     {
       lcfg.printError();
       lcfg.printUsage();
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 7fa6549686b9daeadfc8802213aac41a0bba4dec..d842b4b66bb572b9758cd5bc164057f06686169f 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -5628,7 +5628,7 @@ revoke_command:
 	grant_privileges ON opt_table FROM user_list
 	{}
 	|
-	ALL PRIVILEGES ',' GRANT OPTION FROM user_list
+	ALL opt_privileges ',' GRANT OPTION FROM user_list
 	{
 	  Lex->sql_command = SQLCOM_REVOKE_ALL;
 	}
@@ -5654,10 +5654,14 @@ grant:
 
 grant_privileges:
 	grant_privilege_list {}
-	| ALL PRIVILEGES	{ Lex->grant = GLOBAL_ACLS;}
-	| ALL			{ Lex->grant = GLOBAL_ACLS;}
+	| ALL opt_privileges	{ Lex->grant = GLOBAL_ACLS;}
         ;
 
+opt_privileges:
+	/* empty */
+	| PRIVILEGES
+	;
+
 grant_privilege_list:
 	grant_privilege
 	| grant_privilege_list ',' grant_privilege;