List:Commits« Previous MessageNext Message »
From:Lars Thalmann Date:September 21 2006 12:23am
Subject:bk commit into 5.1 tree (lars:1.2336)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of lthalmann. When lthalmann does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2006-09-21 00:23:20+02:00, lars@stripped +24 -0
  Merge mysql.com:/users/lthalmann/bkroot/mysql-5.1-new-rpl
  into  mysql.com:/users/lthalmann/bk/MERGE/mysql-5.1-merge
  MERGE: 1.2313.4.11

  BitKeeper/etc/ignore@stripped, 2006-09-21 00:12:49+02:00, lars@stripped +0 -0
    auto-union
    MERGE: 1.246.4.1

  Makefile.am@stripped, 2006-09-21 00:13:45+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.95.1.1

  client/mysqldump.c@stripped, 2006-09-21 00:13:46+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.248.1.2

  mysql-test/r/information_schema.result@stripped, 2006-09-21 00:13:47+02:00,
lars@stripped +0 -0
    Auto merged
    MERGE: 1.133.1.1

  mysql-test/r/mysqldump.result@stripped, 2006-09-21 00:23:12+02:00, lars@stripped
+22 -390
    Restoring rpl tree mysqldump test file to main tree test files
    MERGE: 1.125.1.3

  mysql-test/r/status.result@stripped, 2006-09-21 00:23:12+02:00, lars@stripped +5 -5
    Manual merge
    MERGE: 1.12.1.1

  mysql-test/t/disabled.def@stripped, 2006-09-21 00:13:47+02:00, lars@stripped +0 -1
    Auto merged
    MERGE: 1.196.1.1

  mysql-test/t/mysqldump.test@stripped, 2006-09-21 00:23:12+02:00, lars@stripped +180
-283
    Restoring rpl tree mysqldump test file to main tree test files
    MERGE: 1.118.1.4

  sql/CMakeLists.txt@stripped, 2006-09-21 00:13:47+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.23.1.10

  sql/Makefile.am@stripped, 2006-09-21 00:13:48+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.145.1.11

  sql/ha_ndbcluster.cc@stripped, 2006-09-21 00:13:48+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.358.1.1

  sql/log.cc@stripped, 2006-09-21 00:13:49+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.228.1.1

  sql/log_event.cc@stripped, 2006-09-21 00:13:49+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.237.2.4

  sql/mysql_priv.h@stripped, 2006-09-21 00:13:50+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.436.1.1

  sql/mysqld.cc@stripped, 2006-09-21 00:13:50+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.564.16.1

  sql/sp_head.cc@stripped, 2006-09-21 00:13:51+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.232.1.4

  sql/sql_class.cc@stripped, 2006-09-21 00:13:51+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.285.1.4

  sql/sql_class.h@stripped, 2006-09-21 00:13:51+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.304.8.1

  sql/sql_insert.cc@stripped, 2006-09-21 00:13:51+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.223.1.2

  sql/sql_parse.cc@stripped, 2006-09-21 00:13:52+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.567.6.2

  sql/sql_show.cc@stripped, 2006-09-21 00:13:52+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.354.1.15

  sql/sql_yacc.yy@stripped, 2006-09-21 00:13:53+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.484.11.2

  sql/table.h@stripped, 2006-09-21 00:13:53+02:00, lars@stripped +0 -0
    Auto merged
    MERGE: 1.148.1.3

  storage/innobase/handler/ha_innodb.cc@stripped, 2006-09-21 00:13:54+02:00,
lars@stripped +0 -0
    Auto merged
    MERGE: 1.293.1.4

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	lars
# Host:	dl145j.mysql.com
# Root:	/users/lthalmann/bk/MERGE/mysql-5.1-merge/RESYNC

--- 1.249/client/mysqldump.c	2006-09-21 00:23:55 +02:00
+++ 1.250/client/mysqldump.c	2006-09-21 00:23:55 +02:00
@@ -671,13 +671,13 @@ get_one_option(int optid, const struct m
       tty_password=1;
     break;
   case 'r':
-    if (!(md_result_file = my_fopen(argument, O_WRONLY | FILE_BINARY,
+    if (!(md_result_file= my_fopen(argument, O_WRONLY | FILE_BINARY,
                                     MYF(MY_WME))))
       exit(1);
     break;
   case 'W':
 #ifdef __WIN__
-    opt_protocol = MYSQL_PROTOCOL_PIPE;
+    opt_protocol= MYSQL_PROTOCOL_PIPE;
 #endif
     break;
   case 'N':
@@ -692,7 +692,7 @@ get_one_option(int optid, const struct m
 #include <sslopt-case.h>
   case 'V': print_version(); exit(0);
   case 'X':
-    opt_xml = 1;
+    opt_xml= 1;
     extended_insert= opt_drop= opt_lock=
       opt_disable_keys= opt_autocommit= opt_create_db= 0;
     break;
@@ -1582,7 +1582,7 @@ static uint get_table_structure(char *ta
   const char *insert_option;
   char	     name_buff[NAME_LEN+3],table_buff[NAME_LEN*2+3];
   char       table_buff2[NAME_LEN*2+3], query_buff[QUERY_LENGTH];
-  FILE       *sql_file = md_result_file;
+  FILE       *sql_file= md_result_file;
   int        len;
   MYSQL_RES  *result;
   MYSQL_ROW  row;
@@ -1626,7 +1626,7 @@ static uint get_table_structure(char *ta
   opt_quoted_table= quote_name(table, table_buff2, 0);
 
   if (opt_order_by_primary)
-    order_by = primary_key_fields(result_table);
+    order_by= primary_key_fields(result_table);
 
   if (!opt_xml && !mysql_query_with_error_report(mysql, 0, query_buff))
   {
@@ -1678,7 +1678,7 @@ static uint get_table_structure(char *ta
       field= mysql_fetch_field_direct(result, 0);
       if (strcmp(field->name, "View") == 0)
       {
-        char *scv_buff = NULL;
+        char *scv_buff= NULL;
 
         verbose_msg("-- It's a view, create dummy table for view\n");
 
@@ -1715,7 +1715,7 @@ static uint get_table_structure(char *ta
           my_free(scv_buff, MYF(MY_ALLOW_ZERO_PTR));
 
           safe_exit(EX_MYSQLERR);
-          DBUG_RETURN(0); 
+          DBUG_RETURN(0);
         }
         else
           my_free(scv_buff, MYF(MY_ALLOW_ZERO_PTR));
@@ -2085,7 +2085,7 @@ static void dump_triggers_for_table (cha
   char       name_buff[NAME_LEN*4+3], table_buff[NAME_LEN*2+3];
   char       query_buff[QUERY_LENGTH];
   uint old_opt_compatible_mode=opt_compatible_mode;
-  FILE       *sql_file = md_result_file;
+  FILE       *sql_file= md_result_file;
   MYSQL_RES  *result;
   MYSQL_ROW  row;
 
@@ -2329,15 +2329,15 @@ static void dump_table(char *table, char
     end= strmov(end,buff);
     if (where || order_by)
     {
-      query = alloc_query_str((ulong) ((end - query) + 1 +
+      query= alloc_query_str((ulong) ((end - query) + 1 +
                              (where ? strlen(where) + 7 : 0) +
                              (order_by ? strlen(order_by) + 10 : 0)));
-      end = strmov(query, query_buf);
+      end= strmov(query, query_buf);
 
       if (where)
-        end = strxmov(end, " WHERE ", where, NullS);
+        end= strxmov(end, " WHERE ", where, NullS);
       if (order_by)
-        end = strxmov(end, " ORDER BY ", order_by, NullS);
+        end= strxmov(end, " ORDER BY ", order_by, NullS);
     }
     if (mysql_real_query(mysql, query, (uint) (end - query)))
     {
@@ -2358,10 +2358,10 @@ static void dump_table(char *table, char
                 result_table);
     if (where || order_by)
     {
-      query = alloc_query_str((ulong) (strlen(query) + 1 +
+      query= alloc_query_str((ulong) (strlen(query) + 1 +
                              (where ? strlen(where) + 7 : 0) +
                              (order_by ? strlen(order_by) + 10 : 0)));
-      end = strmov(query, query_buf);
+      end= strmov(query, query_buf);
 
       if (where)
       {
@@ -2370,7 +2370,7 @@ static void dump_table(char *table, char
           fprintf(md_result_file, "-- WHERE:  %s\n", where);
           check_io(md_result_file);
         }
-        end = strxmov(end, " WHERE ", where, NullS);
+        end= strxmov(end, " WHERE ", where, NullS);
       }
       if (order_by)
       {
@@ -2379,7 +2379,7 @@ static void dump_table(char *table, char
           fprintf(md_result_file, "-- ORDER BY:  %s\n", order_by);
           check_io(md_result_file);
         }
-        end = strxmov(end, " ORDER BY ", order_by, NullS);
+        end= strxmov(end, " ORDER BY ", order_by, NullS);
       }
     }
     if (!opt_xml && !opt_compact)
@@ -2455,12 +2455,12 @@ static void dump_table(char *table, char
         check_io(md_result_file);
       }
 
-      for (i = 0; i < mysql_num_fields(res); i++)
+      for (i= 0; i < mysql_num_fields(res); i++)
       {
         int is_blob;
         ulong length= lengths[i];
 
-        if (!(field = mysql_fetch_field(res)))
+        if (!(field= mysql_fetch_field(res)))
         {
           my_snprintf(query, QUERY_LENGTH,
                       "%s: Not enough fields from table %s! Aborting.\n",
@@ -2532,7 +2532,7 @@ static void dump_table(char *table, char
               else
               {
                 /* change any strings ("inf", "-inf", "nan") into NULL */
-                char *ptr = row[i];
+                char *ptr= row[i];
                 if (my_isalpha(charset_info, *ptr) || (*ptr == '-' &&
                     my_isalpha(charset_info, ptr[1])))
                   dynstr_append(&extended_row, "NULL");
@@ -2592,7 +2592,7 @@ static void dump_table(char *table, char
             else
             {
               /* change any strings ("inf", "-inf", "nan") into NULL */
-              char *ptr = row[i];
+              char *ptr= row[i];
               if (opt_xml)
               {
                 print_xml_tag1(md_result_file, "\t\t", "field name=",
@@ -2638,10 +2638,10 @@ static void dump_table(char *table, char
       {
         ulong row_length;
         dynstr_append(&extended_row,")");
-        row_length = 2 + extended_row.length;
+        row_length= 2 + extended_row.length;
         if (total_length + row_length < opt_net_buffer_length)
         {
-          total_length += row_length;
+          total_length+= row_length;
           fputc(',',md_result_file);            /* Always row break */
           fputs(extended_row.str,md_result_file);
         }
@@ -2653,7 +2653,7 @@ static void dump_table(char *table, char
 
           fputs(insert_pat.str,md_result_file);
           fputs(extended_row.str,md_result_file);
-          total_length = row_length+init_length;
+          total_length= row_length+init_length;
         }
         check_io(md_result_file);
       }
@@ -2718,15 +2718,15 @@ err:
 
 static char *getTableName(int reset)
 {
-  static MYSQL_RES *res = NULL;
+  static MYSQL_RES *res= NULL;
   MYSQL_ROW    row;
 
   if (!res)
   {
-    if (!(res = mysql_list_tables(mysql,NullS)))
+    if (!(res= mysql_list_tables(mysql,NullS)))
       return(NULL);
   }
-  if ((row = mysql_fetch_row(res)))
+  if ((row= mysql_fetch_row(res)))
     return((char*) row[0]);
 
   if (reset)
@@ -2734,7 +2734,7 @@ static char *getTableName(int reset)
   else
   {
     mysql_free_result(res);
-    res = NULL;
+    res= NULL;
   }
   return(NULL);
 } /* getTableName */
@@ -2872,7 +2872,7 @@ static int dump_all_databases()
 
   if (mysql_query_with_error_report(mysql, &tableres, "SHOW DATABASES"))
     return 1;
-  while ((row = mysql_fetch_row(tableres)))
+  while ((row= mysql_fetch_row(tableres)))
   {
     if (dump_all_tables_in_db(row[0]))
       result=1;
@@ -2880,13 +2880,13 @@ static int dump_all_databases()
   if (seen_views)
   {
     if (mysql_query(mysql, "SHOW DATABASES") ||
-        !(tableres = mysql_store_result(mysql)))
+        !(tableres= mysql_store_result(mysql)))
     {
       my_printf_error(0, "Error: Couldn't execute 'SHOW DATABASES': %s",
                       MYF(0), mysql_error(mysql));
       return 1;
     }
-    while ((row = mysql_fetch_row(tableres)))
+    while ((row= mysql_fetch_row(tableres)))
     {
       if (dump_all_views_in_db(row[0]))
         result=1;
@@ -3332,7 +3332,7 @@ static int do_show_master_status(MYSQL *
   }
   else
   {
-    row = mysql_fetch_row(master);
+    row= mysql_fetch_row(master);
     if (row && row[0] && row[1])
     {
       /* SHOW MASTER STATUS reports file and position */
@@ -3459,7 +3459,7 @@ static void print_value(FILE *file, MYSQ
   MYSQL_FIELD   *field;
   mysql_field_seek(result, 0);
 
-  for ( ; (field = mysql_fetch_field(result)) ; row++)
+  for ( ; (field= mysql_fetch_field(result)) ; row++)
   {
     if (!strcmp(field->name,name))
     {
@@ -3587,17 +3587,19 @@ char check_if_ignore_table(const char *t
 
 static char *primary_key_fields(const char *table_name)
 {
-  MYSQL_RES  *res = NULL;
+  MYSQL_RES  *res= NULL;
   MYSQL_ROW  row;
   /* SHOW KEYS FROM + table name * 2 (escaped) + 2 quotes + \0 */
   char show_keys_buff[15 + NAME_LEN * 2 + 3];
-  uint result_length = 0;
-  char *result = 0;
+  uint result_length= 0;
+  char *result= 0;
+  char buff[NAME_LEN * 2 + 3];
+  char *quoted_field;
 
   my_snprintf(show_keys_buff, sizeof(show_keys_buff),
               "SHOW KEYS FROM %s", table_name);
   if (mysql_query(mysql, show_keys_buff) ||
-      !(res = mysql_store_result(mysql)))
+      !(res= mysql_store_result(mysql)))
   {
     fprintf(stderr, "Warning: Couldn't read keys from table %s;"
             " records are NOT sorted (%s)\n",
@@ -3612,12 +3614,14 @@ static char *primary_key_fields(const ch
    * row, and UNIQUE keys come before others.  So we only need to check
    * the first key, not all keys.
    */
-  if ((row = mysql_fetch_row(res)) && atoi(row[1]) == 0)
+  if ((row= mysql_fetch_row(res)) && atoi(row[1]) == 0)
   {
     /* Key is unique */
     do
-      result_length += strlen(row[4]) + 1;      /* + 1 for ',' or \0 */
-    while ((row = mysql_fetch_row(res)) && atoi(row[3]) > 1);
+    {
+      quoted_field= quote_name(row[4], buff, 0);
+      result_length+= strlen(quoted_field) + 1; /* + 1 for ',' or \0 */
+    } while ((row= mysql_fetch_row(res)) && atoi(row[3]) > 1);
   }
 
   /* Build the ORDER BY clause result */
@@ -3625,17 +3629,21 @@ static char *primary_key_fields(const ch
   {
     char *end;
     /* result (terminating \0 is already in result_length) */
-    result = my_malloc(result_length + 10, MYF(MY_WME));
+    result= my_malloc(result_length + 10, MYF(MY_WME));
     if (!result)
     {
       fprintf(stderr, "Error: Not enough memory to store ORDER BY clause\n");
       goto cleanup;
     }
     mysql_data_seek(res, 0);
-    row = mysql_fetch_row(res);
-    end = strmov(result, row[4]);
-    while ((row = mysql_fetch_row(res)) && atoi(row[3]) > 1)
-      end = strxmov(end, ",", row[4], NullS);
+    row= mysql_fetch_row(res);
+    quoted_field= quote_name(row[4], buff, 0);
+    end= strmov(result, quoted_field);
+    while ((row= mysql_fetch_row(res)) && atoi(row[3]) > 1)
+    {
+      quoted_field= quote_name(row[4], buff, 0);
+      end= strxmov(end, ",", quoted_field, NullS);
+    }
   }
 
 cleanup:
@@ -3703,7 +3711,7 @@ static my_bool get_view_structure(char *
   char       table_buff[NAME_LEN*2+3];
   char       table_buff2[NAME_LEN*2+3];
   char       query[QUERY_LENGTH];
-  FILE       *sql_file = md_result_file;
+  FILE       *sql_file= md_result_file;
   DBUG_ENTER("get_view_structure");
 
   if (opt_no_create_info) /* Don't write table creation info */

--- 1.155/sql/Makefile.am	2006-09-21 00:23:55 +02:00
+++ 1.156/sql/Makefile.am	2006-09-21 00:23:55 +02:00
@@ -52,7 +52,7 @@ noinst_HEADERS =	item.h item_func.h item
 			ha_partition.h \
 			ha_ndbcluster.h ha_ndbcluster_binlog.h \
 			ha_ndbcluster_tables.h \
-			opt_range.h protocol.h rpl_tblmap.h \
+			opt_range.h protocol.h rpl_tblmap.h rpl_utility.h \
 			log.h sql_show.h rpl_rli.h \
 			sql_select.h structs.h table.h sql_udf.h hash_filo.h \
 			lex.h lex_symbol.h sql_acl.h sql_crypt.h  \
@@ -93,7 +93,7 @@ mysqld_SOURCES =	sql_lex.cc sql_handler.
 			sql_load.cc mf_iocache.cc field_conv.cc sql_show.cc \
 			sql_udf.cc sql_analyse.cc sql_analyse.h sql_cache.cc \
 			slave.cc sql_repl.cc rpl_filter.cc rpl_tblmap.cc \
-			rpl_injector.cc \
+			rpl_utility.cc rpl_injector.cc \
                         sql_union.cc sql_derived.cc \
 			client.c sql_client.cc mini_client_errors.c pack.c\
 			stacktrace.c repl_failsafe.h repl_failsafe.cc \

--- 1.231/sql/log.cc	2006-09-21 00:23:55 +02:00
+++ 1.232/sql/log.cc	2006-09-21 00:23:55 +02:00
@@ -3171,7 +3171,7 @@ int MYSQL_BIN_LOG::
   flush_and_set_pending_rows_event(THD *thd, Rows_log_event* event)
 {
   DBUG_ENTER("MYSQL_BIN_LOG::flush_and_set_pending_rows_event(event)");
-  DBUG_ASSERT(thd->current_stmt_binlog_row_based && mysql_bin_log.is_open());
+  DBUG_ASSERT(mysql_bin_log.is_open());
   DBUG_PRINT("enter", ("event=%p", event));
 
   int error= 0;
@@ -3416,9 +3416,6 @@ bool MYSQL_BIN_LOG::write(Log_event *eve
           }
         }
       }
-      /* Forget those values, for next binlogger: */
-      thd->stmt_depends_on_first_successful_insert_id_in_prev_stmt= 0;
-      thd->auto_inc_intervals_in_cur_stmt_for_binlog.empty();
     }
 
     /*

--- 1.242/sql/log_event.cc	2006-09-21 00:23:55 +02:00
+++ 1.243/sql/log_event.cc	2006-09-21 00:23:55 +02:00
@@ -3924,7 +3924,7 @@ int User_var_log_event::exec_event(struc
     a single record and with a single column. Thus, like
     a column value, it could always have IMPLICIT derivation.
    */
-  e.update_hash(val, val_len, type, charset, DERIVATION_IMPLICIT);
+  e.update_hash(val, val_len, type, charset, DERIVATION_IMPLICIT, 0);
   free_root(thd->mem_root,0);
 
   rli->inc_event_relay_log_pos();

--- 1.439/sql/mysql_priv.h	2006-09-21 00:23:55 +02:00
+++ 1.440/sql/mysql_priv.h	2006-09-21 00:23:55 +02:00
@@ -21,6 +21,9 @@
   except the part which must be in the server and in the client.
 */
 
+#ifndef MYSQL_PRIV_H
+#define MYSQL_PRIV_H
+
 #ifndef MYSQL_CLIENT
 
 #include <my_global.h>
@@ -2040,3 +2043,5 @@ bool schema_table_store_record(THD *thd,
 
 #endif /* MYSQL_SERVER */
 #endif /* MYSQL_CLIENT */
+
+#endif /* MYSQL_PRIV_H */

--- 1.576/sql/mysqld.cc	2006-09-21 00:23:55 +02:00
+++ 1.577/sql/mysqld.cc	2006-09-21 00:23:55 +02:00
@@ -3120,7 +3120,11 @@ with --log-bin instead.");
       global_system_variables.binlog_format= BINLOG_FORMAT_ROW;
     else
 #endif
+#if defined(HAVE_ROW_BASED_REPLICATION)
+      global_system_variables.binlog_format= BINLOG_FORMAT_MIXED;
+#else
       global_system_variables.binlog_format= BINLOG_FORMAT_STMT;
+#endif
   }
 
   /* Check that we have not let the format to unspecified at this point */
@@ -4886,7 +4890,13 @@ struct my_option my_long_options[] =
    "supports only statement-based binary logging, so only 'statement' is "
    "a legal value."
 #endif
-   , 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
+   , 0, 0, 0, GET_STR, REQUIRED_ARG,
+#ifdef HAVE_ROW_BASED_REPLICATION
+   BINLOG_FORMAT_MIXED
+#else
+   BINLOG_FORMAT_STMT
+#endif
+   , 0, 0, 0, 0, 0 },
   {"binlog-do-db", OPT_BINLOG_DO_DB,
    "Tells the master it should log updates for the specified database, and exclude all
others not explicitly mentioned.",
    0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},

--- 1.288/sql/sql_class.cc	2006-09-21 00:23:55 +02:00
+++ 1.289/sql/sql_class.cc	2006-09-21 00:23:55 +02:00
@@ -634,6 +634,12 @@ bool THD::store_globals()
 
 void THD::cleanup_after_query()
 {
+  if (!in_sub_stmt) /* stored functions and triggers are a special case */
+  {
+    /* Forget those values, for next binlogger: */
+    stmt_depends_on_first_successful_insert_id_in_prev_stmt= 0;
+    auto_inc_intervals_in_cur_stmt_for_binlog.empty();
+  }
   if (first_successful_insert_id_in_cur_stmt > 0)
   {
     /* set what LAST_INSERT_ID() will return */
@@ -2661,7 +2667,12 @@ int THD::binlog_delete_row(TABLE* table,
 int THD::binlog_flush_pending_rows_event(bool stmt_end)
 {
   DBUG_ENTER("THD::binlog_flush_pending_rows_event");
-  if (!current_stmt_binlog_row_based || !mysql_bin_log.is_open())
+  /*
+    We shall flush the pending event even if we are not in row-based
+    mode: it might be the case that we left row-based mode before
+    flushing anything (e.g., if we have explicitly locked tables).
+   */
+  if (!mysql_bin_log.is_open())
     DBUG_RETURN(0);
 
   /*
@@ -2727,6 +2738,21 @@ int THD::binlog_query(THD::enum_binlog_q
   DBUG_PRINT("enter", ("qtype=%d, query='%s'", qtype, query));
   DBUG_ASSERT(query && mysql_bin_log.is_open());
 
+  /*
+    If we are not in prelocked mode, mysql_unlock_tables() will be
+    called after this binlog_query(), so we have to flush the pending
+    rows event with the STMT_END_F set to unlock all tables at the
+    slave side as well.
+
+    If we are in prelocked mode, the flushing will be done inside the
+    top-most close_thread_tables().
+  */
+#ifdef HAVE_ROW_BASED_REPLICATION
+  if (this->prelocked_mode == NON_PRELOCKED)
+    if (int error= binlog_flush_pending_rows_event(TRUE))
+      DBUG_RETURN(error);
+#endif /*HAVE_ROW_BASED_REPLICATION*/
+
   switch (qtype) {
   case THD::MYSQL_QUERY_TYPE:
     /*
@@ -2740,25 +2766,7 @@ int THD::binlog_query(THD::enum_binlog_q
   case THD::ROW_QUERY_TYPE:
 #ifdef HAVE_ROW_BASED_REPLICATION
     if (current_stmt_binlog_row_based)
-    {
-      /*
-        If thd->lock is set, then we are not inside a stored function.
-        In that case, mysql_unlock_tables() will be called after this
-        binlog_query(), so we have to flush the pending rows event
-        with the STMT_END_F set to unlock all tables at the slave side
-        as well.
-
-        We will not flush the pending event, if thd->lock is NULL.
-        This means that we are inside a stored function or trigger, so
-        the flushing will be done inside the top-most
-        close_thread_tables().
-       */
-#ifdef HAVE_ROW_BASED_REPLICATION
-      if (this->lock)
-        DBUG_RETURN(binlog_flush_pending_rows_event(TRUE));
-#endif /*HAVE_ROW_BASED_REPLICATION*/
       DBUG_RETURN(0);
-    }
 #endif
     /* Otherwise, we fall through */
   case THD::STMT_QUERY_TYPE:

--- 1.224/sql/sql_insert.cc	2006-09-21 00:23:55 +02:00
+++ 1.225/sql/sql_insert.cc	2006-09-21 00:23:56 +02:00
@@ -979,7 +979,7 @@ bool mysql_prepare_insert(THD *thd, TABL
       update_non_unique_table_error(table_list, "INSERT", duplicate);
       DBUG_RETURN(TRUE);
     }
-    select_lex->fix_prepare_information(thd, &fake_conds);
+    select_lex->fix_prepare_information(thd, &fake_conds, &fake_conds);
     select_lex->first_execution= 0;
   }
   if (duplic == DUP_UPDATE || duplic == DUP_REPLACE)
@@ -2780,8 +2780,8 @@ static TABLE *create_table_from_items(TH
   tmp_table.s->db_create_options=0;
   tmp_table.s->blob_ptr_size= portable_sizeof_char_ptr;
   tmp_table.s->db_low_byte_first= 
-        test(create_info->db_type == &myisam_hton ||
-             create_info->db_type == &heap_hton);
+        test(create_info->db_type == myisam_hton ||
+             create_info->db_type == heap_hton);
   tmp_table.null_row=tmp_table.maybe_null=0;
 
   while ((item=it++))

--- 1.578/sql/sql_parse.cc	2006-09-21 00:23:56 +02:00
+++ 1.579/sql/sql_parse.cc	2006-09-21 00:23:56 +02:00
@@ -5830,9 +5830,14 @@ void mysql_reset_thd_for_next_command(TH
   DBUG_ASSERT(!thd->spcont); /* not for substatements of routines */
   thd->free_list= 0;
   thd->select_number= 1;
+  /*
+    Those two lines below are theoretically unneeded as
+    THD::cleanup_after_query() should take care of this already.
+  */
   thd->auto_inc_intervals_in_cur_stmt_for_binlog.empty();
-  thd->stmt_depends_on_first_successful_insert_id_in_prev_stmt= 
-    thd->query_start_used= 0;
+  thd->stmt_depends_on_first_successful_insert_id_in_prev_stmt= 0;
+
+  thd->query_start_used= 0;
   thd->is_fatal_error= thd->time_zone_used= 0;
   thd->server_status&= ~ (SERVER_MORE_RESULTS_EXISTS | 
                           SERVER_QUERY_NO_INDEX_USED |

--- 1.361/sql/sql_show.cc	2006-09-21 00:23:57 +02:00
+++ 1.362/sql/sql_show.cc	2006-09-21 00:23:57 +02:00
@@ -1995,15 +1995,22 @@ void remove_status_vars(SHOW_VAR *list)
   }
 }
 
+inline void make_upper(char *buf)
+{
+  for (; *buf; buf++)
+    *buf= my_toupper(system_charset_info, *buf);
+}
+
 static bool show_status_array(THD *thd, const char *wild,
                               SHOW_VAR *variables,
                               enum enum_var_type value_type,
                               struct system_status_var *status_var,
-                              const char *prefix, TABLE *table)
+                              const char *prefix, TABLE *table,
+                              bool ucase_names)
 {
   char buff[SHOW_VAR_FUNC_BUFF_SIZE], *prefix_end;
-  /* the variable name should not be longer then 80 characters */
-  char name_buffer[80];
+  /* the variable name should not be longer than 64 characters */
+  char name_buffer[64];
   int len;
   LEX_STRING null_lex_str;
   SHOW_VAR tmp, *var;
@@ -2021,6 +2028,8 @@ static bool show_status_array(THD *thd, 
   {
     strnmov(prefix_end, variables->name, len);
     name_buffer[sizeof(name_buffer)-1]=0;       /* Safety */
+    if (ucase_names)
+      make_upper(name_buffer);
 
     /*
       if var->type is SHOW_FUNC, call the function.
@@ -2032,8 +2041,8 @@ static bool show_status_array(THD *thd, 
     SHOW_TYPE show_type=var->type;
     if (show_type == SHOW_ARRAY)
     {
-      show_status_array(thd, wild, (SHOW_VAR *) var->value,
-                        value_type, status_var, name_buffer, table);
+      show_status_array(thd, wild, (SHOW_VAR *) var->value, value_type,
+                        status_var, name_buffer, table, ucase_names);
     }
     else
     {
@@ -2042,7 +2051,7 @@ static bool show_status_array(THD *thd, 
       {
         char *value=var->value;
         const char *pos, *end;                  // We assign a lot of const's
-        long nr;
+
         if (show_type == SHOW_SYS)
         {
           show_type= ((sys_var*) value)->type();
@@ -2124,6 +2133,7 @@ static bool show_status_array(THD *thd, 
         table->field[0]->store(name_buffer, strlen(name_buffer),
                                system_charset_info);
         table->field[1]->store(pos, (uint32) (end - pos), system_charset_info);
+        table->field[1]->set_notnull();
         if (schema_table_store_record(thd, table))
           DBUG_RETURN(TRUE);
       }
@@ -4387,7 +4397,7 @@ int fill_variables(THD *thd, TABLE_LIST 
   const char *wild= lex->wild ? lex->wild->ptr() : NullS;
   pthread_mutex_lock(&LOCK_global_system_variables);
   res= show_status_array(thd, wild, init_vars,
-                         lex->option_type, 0, "", tables->table);
+                         lex->option_type, 0, "", tables->table, 0);
   pthread_mutex_unlock(&LOCK_global_system_variables);
   DBUG_RETURN(res);
 }
@@ -4407,7 +4417,8 @@ int fill_status(THD *thd, TABLE_LIST *ta
                          (SHOW_VAR *)all_status_vars.buffer,
                          OPT_GLOBAL,
                          (lex->option_type == OPT_GLOBAL ?
-                          &tmp: thd->initial_status_var), "",tables->table);
+                          &tmp: thd->initial_status_var),
+                         "", tables->table, 0);
   pthread_mutex_unlock(&LOCK_status);
   DBUG_RETURN(res);
 }
@@ -4556,6 +4567,21 @@ TABLE *create_schema_table(THD *thd, TAB
         DBUG_RETURN(0);
       }
       break;
+    case MYSQL_TYPE_DECIMAL:
+      if (!(item= new Item_decimal((longlong) fields_info->value, false)))
+      {
+        DBUG_RETURN(0);
+      }
+      item->unsigned_flag= (fields_info->field_length/10000)%10;
+      item->decimals= fields_info->field_length%10;
+      item->max_length= (fields_info->field_length/100)%100;
+      if (item->unsigned_flag == 0)
+        item->max_length+= 1;
+      if (item->decimals > 0)
+        item->max_length+= 1;
+      item->set_name(fields_info->field_name,
+                     strlen(fields_info->field_name), cs);
+      break;
     default:
       /* this should be changed when Item_empty_string is fixed(in 4.1) */
       if (!(item= new Item_empty_string("", 0, cs)))
@@ -4995,6 +5021,173 @@ int fill_schema_files(THD *thd, TABLE_LI
   DBUG_RETURN(0);
 }
 
+int fill_schema_status(THD *thd, SHOW_VAR *variables,
+                       struct system_status_var *status_var,
+                       const char *prefix, TABLE *table)
+{
+  SHOW_VAR tmp, *var;
+  SHOW_TYPE show_type;
+  LEX_STRING null_lex_str;
+  char buff[SHOW_VAR_FUNC_BUFF_SIZE];
+  char name_buf[64], *name_pos;
+  int name_len;
+  DBUG_ENTER("fill_schema_status");
+  
+  null_lex_str.str= 0;
+  null_lex_str.length= 0;
+  
+  name_pos= strnmov(name_buf, prefix, sizeof(name_buf) - 1);
+  if (*prefix)
+    *name_pos++= '_';
+  name_len= name_buf + sizeof(name_buf) - name_pos;
+  
+  for (; variables->name; variables++)
+  {
+    strnmov(name_pos, variables->name, name_len);
+    name_buf[sizeof(name_buf) - 1]= 0;
+    make_upper(name_buf);
+    
+    for (var= variables; var->type == SHOW_FUNC; var= &tmp)
+      ((mysql_show_var_func)(var->value))(thd, &tmp, buff);
+      
+    show_type= var->type;
+    
+    if (show_type == SHOW_ARRAY)
+    {
+      fill_schema_status(thd, (SHOW_VAR*) var->value,
+                         status_var, name_buf, table);
+    }
+    else
+    {
+      char *value= var->value;
+      
+      restore_record(table, s->default_values);
+      table->field[0]->store(name_buf, strlen(name_buf), system_charset_info);
+      
+      if (show_type == SHOW_SYS)
+      {
+        show_type= ((sys_var*) value)->type();
+        value= (char*) ((sys_var*) value)->value_ptr(thd, OPT_GLOBAL,
+                                                     &null_lex_str);
+      }
+                                                     
+      switch (show_type)
+      {
+      case SHOW_DOUBLE_STATUS:
+        value= (char*) status_var + (ulong) value;
+        table->field[1]->store(*(double*) value);
+        break;
+      case SHOW_LONG_STATUS:
+        value= (char*) status_var + (ulong) value;
+        /* fall through */
+      case SHOW_LONG:
+      case SHOW_LONG_NOFLUSH: /* the difference lies in refresh_status() */
+        table->field[1]->store((longlong) *(long*) value, false);
+        break;
+      case SHOW_LONGLONG:
+        table->field[1]->store(*(longlong*) value, false);
+        break;
+      case SHOW_HA_ROWS:
+        table->field[1]->store((longlong) *(ha_rows*) value, false);
+        break;
+      case SHOW_BOOL:
+        table->field[1]->store((longlong) *(bool*) value, false);
+        break;
+      case SHOW_MY_BOOL:
+        table->field[1]->store((longlong) *(my_bool*) value, false);
+        break;
+      case SHOW_INT:
+        table->field[1]->store((longlong) *(uint32*) value, false);
+        break;
+      case SHOW_HAVE: /* always displayed as 0 */
+        table->field[1]->store((longlong) 0, false);
+        break;
+      case SHOW_CHAR_PTR:
+        value= *(char**) value;
+        /* fall through */
+      case SHOW_CHAR: /* always displayed as 0 */
+        table->field[1]->store((longlong) 0, false);
+        break;
+      case SHOW_KEY_CACHE_LONG:
+        value= (char*) dflt_key_cache + (ulong) value;
+        table->field[1]->store((longlong) *(long*) value, false);
+        break;
+      case SHOW_KEY_CACHE_LONGLONG:
+        value= (char*) dflt_key_cache + (ulong) value;
+        table->field[1]->store(*(longlong*) value, false);
+        break;
+      case SHOW_UNDEF: /* always displayed as 0 */
+        table->field[1]->store((longlong) 0, false);
+        break;
+      case SHOW_SYS: /* cannot happen */
+      default:
+        DBUG_ASSERT(0);
+        break;
+      }
+      
+      table->field[1]->set_notnull();
+      if (schema_table_store_record(thd, table))
+        DBUG_RETURN(1);
+    }
+  }
+  
+  DBUG_RETURN(0);
+}
+
+int fill_schema_global_status(THD *thd, TABLE_LIST *tables, COND *cond)
+{
+  STATUS_VAR tmp;
+  int res= 0;
+  DBUG_ENTER("fill_schema_global_status");
+  
+  pthread_mutex_lock(&LOCK_status);
+  calc_sum_of_all_status(&tmp);
+  res= fill_schema_status(thd, (SHOW_VAR*) all_status_vars.buffer,
+                          &tmp, "", tables->table);
+  pthread_mutex_unlock(&LOCK_status);
+  
+  DBUG_RETURN(res);
+}
+
+int fill_schema_session_status(THD *thd, TABLE_LIST *tables, COND *cond)
+{
+  int res= 0;
+  DBUG_ENTER("fill_schema_session_status");
+  
+  pthread_mutex_lock(&LOCK_status);
+  res= fill_schema_status(thd, (SHOW_VAR*) all_status_vars.buffer,
+                          &thd->status_var, "", tables->table);
+  pthread_mutex_unlock(&LOCK_status);
+  
+  DBUG_RETURN(res);
+}
+
+int fill_schema_global_variables(THD *thd, TABLE_LIST *tables, COND *cond)
+{
+  int res= 0;
+  DBUG_ENTER("fill_schema_global_variables");
+  
+  pthread_mutex_lock(&LOCK_global_system_variables);
+  res= show_status_array(thd, "", init_vars, OPT_GLOBAL,
+                         NULL, "", tables->table, 1);
+  pthread_mutex_unlock(&LOCK_global_system_variables);
+  
+  DBUG_RETURN(res);
+}
+
+int fill_schema_session_variables(THD *thd, TABLE_LIST *tables, COND *cond)
+{
+  int res= 0;
+  DBUG_ENTER("fill_schema_session_variables");
+  
+  pthread_mutex_lock(&LOCK_global_system_variables);
+  res= show_status_array(thd, "", init_vars, OPT_SESSION,
+                         NULL, "", tables->table, 1);
+  pthread_mutex_unlock(&LOCK_global_system_variables);
+  
+  DBUG_RETURN(res);
+}
+
 ST_FIELD_INFO schema_fields_info[]=
 {
   {"CATALOG_NAME", FN_REFLEN, MYSQL_TYPE_STRING, 0, 1, 0},
@@ -5347,6 +5540,22 @@ ST_FIELD_INFO variables_fields_info[]=
 };
 
 
+ST_FIELD_INFO status_fields_info[]=
+{
+  {"VARIABLE_NAME", 64, MYSQL_TYPE_STRING, 0, 0, "Variable_name"},
+  {"VARIABLE_VALUE", 2207, MYSQL_TYPE_DECIMAL, 0, 0, "Value"},
+  {0, 0, MYSQL_TYPE_STRING, 0, 0, 0}
+};
+
+
+ST_FIELD_INFO system_variables_fields_info[]=
+{
+  {"VARIABLE_NAME", 64, MYSQL_TYPE_STRING, 0, 0, "Variable_name"},
+  {"VARIABLE_VALUE", 65535, MYSQL_TYPE_STRING, 0, 1, "Value"},
+  {0, 0, MYSQL_TYPE_STRING, 0, 0, 0}
+};
+
+
 ST_FIELD_INFO processlist_fields_info[]=
 {
   {"ID", 4, MYSQL_TYPE_LONG, 0, 0, "Id"},
@@ -5459,6 +5668,10 @@ ST_SCHEMA_TABLE schema_tables[]=
    Events::fill_schema_events, make_old_format, 0, -1, -1, 0},
   {"FILES", files_fields_info, create_schema_table,
    fill_schema_files, 0, 0, -1, -1, 0},
+  {"GLOBAL_STATUS", status_fields_info, create_schema_table,
+   fill_schema_global_status, make_old_format, 0, -1, -1, 0},
+  {"GLOBAL_VARIABLES", system_variables_fields_info, create_schema_table,
+   fill_schema_global_variables, make_old_format, 0, -1, -1, 0},
   {"KEY_COLUMN_USAGE", key_column_usage_fields_info, create_schema_table,
     get_all_tables, 0, get_schema_key_column_usage_record, 4, 5, 0},
   {"OPEN_TABLES", open_tables_fields_info, create_schema_table,
@@ -5478,6 +5691,10 @@ ST_SCHEMA_TABLE schema_tables[]=
    fill_schema_shemata, make_schemata_old_format, 0, 1, -1, 0},
   {"SCHEMA_PRIVILEGES", schema_privileges_fields_info, create_schema_table,
     fill_schema_schema_privileges, 0, 0, -1, -1, 0},
+  {"SESSION_STATUS", status_fields_info, create_schema_table,
+    fill_schema_session_status, make_old_format, 0, -1, -1, 0},
+  {"SESSION_VARIABLES", system_variables_fields_info, create_schema_table,
+    fill_schema_session_variables, make_old_format, 0, -1, -1, 0},
   {"STATISTICS", stat_fields_info, create_schema_table, 
     get_all_tables, make_old_format, get_schema_stat_record, 1, 2, 0},
   {"STATUS", variables_fields_info, create_schema_table, fill_status, 

--- 1.499/sql/sql_yacc.yy	2006-09-21 00:23:58 +02:00
+++ 1.500/sql/sql_yacc.yy	2006-09-21 00:23:58 +02:00
@@ -8670,6 +8670,9 @@ load_data:
 	FROM MASTER_SYM
         {
 	  Lex->sql_command = SQLCOM_LOAD_MASTER_DATA;
+          WARN_DEPRECATED(yythd, "5.2", "LOAD DATA FROM MASTER",
+                          "mysqldump or future "
+                          "BACKUP/RESTORE DATABASE facility");
         };
 
 opt_local:

--- 1.152/sql/table.h	2006-09-21 00:23:58 +02:00
+++ 1.153/sql/table.h	2006-09-21 00:23:58 +02:00
@@ -474,6 +474,8 @@ enum enum_schema_tables
   SCH_ENGINES,
   SCH_EVENTS,
   SCH_FILES,
+  SCH_GLOBAL_STATUS,
+  SCH_GLOBAL_VARIABLES,
   SCH_KEY_COLUMN_USAGE,
   SCH_OPEN_TABLES,
   SCH_PARTITIONS,
@@ -483,6 +485,8 @@ enum enum_schema_tables
   SCH_PROCEDURES,
   SCH_SCHEMATA,
   SCH_SCHEMA_PRIVILEGES,
+  SCH_SESSION_STATUS,
+  SCH_SESSION_VARIABLES,
   SCH_STATISTICS,
   SCH_STATUS,
   SCH_TABLES,

--- 1.134/mysql-test/r/information_schema.result	2006-09-21 00:23:58 +02:00
+++ 1.135/mysql-test/r/information_schema.result	2006-09-21 00:23:58 +02:00
@@ -357,7 +357,7 @@ mysql
 test
 explain select * from v0;
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
-1	PRIMARY	#	ALL	NULL	NULL	NULL	NULL	2	
+1	SIMPLE	#	ALL	NULL	NULL	NULL	NULL	2	
 create view v1 (c) as select table_name from information_schema.tables
 where table_name="v1";
 select * from v1;

--- 1.200/mysql-test/t/disabled.def	2006-09-21 00:23:58 +02:00
+++ 1.201/mysql-test/t/disabled.def	2006-09-21 00:23:58 +02:00
@@ -32,7 +32,6 @@ rpl_ndb_innodb2ndb       : Bug #19710  C
 rpl_ndb_myisam2ndb       : Bug #19710  Cluster replication to partition table fails on
DELETE FROM statement
 rpl_row_blob_innodb      : BUG#18980 2006-04-10 kent    Test fails randomly
 rpl_sp                   : BUG#16456 2006-02-16 jmiller
-rpl_sp_effects           : BUG#19862 2006-06-15 mkindahl
 
 # the below testcase have been reworked to avoid the bug, test contains comment, keep bug
open
 #ndb_binlog_ddl_multi     : BUG#18976 2006-04-10 kent    CRBR: multiple binlog, second
binlog may miss schema log events

--- 1.237/sql/sp_head.cc	2006-09-21 00:23:59 +02:00
+++ 1.238/sql/sp_head.cc	2006-09-21 00:23:59 +02:00
@@ -795,7 +795,7 @@ int cmp_splocal_locations(Item_splocal *
   This set is produced by tracking user variable reads during statement
   execution. 
 
-  Fo SPs, this has the following implications:
+  For SPs, this has the following implications:
   1) thd->user_var_events may contain events from several SP statements and 
      needs to be valid after exection of these statements was finished. In 
      order to achieve that, we
@@ -808,6 +808,14 @@ int cmp_splocal_locations(Item_splocal *
      reset_dynamic(&thd->user_var_events);
      calls in several different places. (TODO cosider moving this into
      mysql_bin_log.write() function)
+
+  4.2 Auto_increment storage in binlog
+
+  As we may write two statements to binlog from one single logical statement
+  (case of "SELECT func1(),func2()": it is binlogged as "SELECT func1()" and
+  then "SELECT func2()"), we need to reset auto_increment binlog variables
+  after each binlogged SELECT. Otherwise, the auto_increment value of the
+  first SELECT would be used for the second too.
 */
 
 
@@ -1527,6 +1535,9 @@ sp_head::execute_function(THD *thd, Item
                      "failed to reflect this change in the binary log");
       }
       reset_dynamic(&thd->user_var_events);
+      /* Forget those values, in case more function calls are binlogged: */
+      thd->stmt_depends_on_first_successful_insert_id_in_prev_stmt= 0;
+      thd->auto_inc_intervals_in_cur_stmt_for_binlog.empty();
     }
   }
 

--- 1.27/sql/CMakeLists.txt	2006-09-21 00:23:59 +02:00
+++ 1.28/sql/CMakeLists.txt	2006-09-21 00:23:59 +02:00
@@ -53,7 +53,7 @@ ADD_EXECUTABLE(mysqld ../sql-common/clie
                rpl_tblmap.cc sql_binlog.cc event_scheduler.cc event_data_objects.cc
                event_queue.cc event_db_repository.cc 
                sql_tablespace.cc events.cc ../sql-common/my_user.c 
-               partition_info.cc rpl_injector.cc sql_locale.cc
+               partition_info.cc rpl_utility.cc rpl_injector.cc sql_locale.cc
                ${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc
   			   ${PROJECT_SOURCE_DIR}/sql/sql_yacc.h
 			   ${PROJECT_SOURCE_DIR}/include/mysqld_error.h

--- 1.253/BitKeeper/etc/ignore	2006-09-21 00:23:59 +02:00
+++ 1.254/BitKeeper/etc/ignore	2006-09-21 00:23:59 +02:00
@@ -1322,6 +1322,7 @@ mysql-test/r/udf.log
 mysql-test/share/mysql
 mysql-test/std_data/*.pem
 mysql-test/t/index_merge.load
+mysql-test/t/rpl_truncate_4ndb.test
 mysql-test/var
 mysql-test/var/*
 mysql.kdevprj

--- 1.13/mysql-test/r/status.result	2006-09-21 00:23:59 +02:00
+++ 1.14/mysql-test/r/status.result	2006-09-21 00:23:59 +02:00
@@ -3,6 +3,10 @@ show status like 'Table_lock%';
 Variable_name	Value
 Table_locks_immediate	0
 Table_locks_waited	0
+select * from information_schema.session_status where variable_name like 'Table_lock%';
+VARIABLE_NAME	VARIABLE_VALUE
+TABLE_LOCKS_IMMEDIATE	0.0000000
+TABLE_LOCKS_WAITED	0.0000000
 SET SQL_LOG_BIN=0;
 drop table if exists t1;
 create table t1(n int) engine=myisam;
@@ -16,6 +20,10 @@ show status like 'Table_lock%';
 Variable_name	Value
 Table_locks_immediate	3
 Table_locks_waited	1
+select * from information_schema.session_status where variable_name like 'Table_lock%';
+VARIABLE_NAME	VARIABLE_VALUE
+TABLE_LOCKS_IMMEDIATE	3.0000000
+TABLE_LOCKS_WAITED	1.0000000
 drop table t1;
 select 1;
 1
@@ -53,21 +61,36 @@ FLUSH STATUS;
 SHOW STATUS LIKE 'max_used_connections';
 Variable_name	Value
 Max_used_connections	1
+SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME LIKE
'max_used_connections';
+VARIABLE_NAME	VARIABLE_VALUE
+MAX_USED_CONNECTIONS	2.0000000
 SET @save_thread_cache_size=@@thread_cache_size;
 SET GLOBAL thread_cache_size=3;
 SHOW STATUS LIKE 'max_used_connections';
 Variable_name	Value
 Max_used_connections	3
+SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME LIKE
'max_used_connections';
+VARIABLE_NAME	VARIABLE_VALUE
+MAX_USED_CONNECTIONS	4.0000000
 FLUSH STATUS;
 SHOW STATUS LIKE 'max_used_connections';
 Variable_name	Value
 Max_used_connections	2
+SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME LIKE
'max_used_connections';
+VARIABLE_NAME	VARIABLE_VALUE
+MAX_USED_CONNECTIONS	3.0000000
 SHOW STATUS LIKE 'max_used_connections';
 Variable_name	Value
 Max_used_connections	3
+SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME LIKE
'max_used_connections';
+VARIABLE_NAME	VARIABLE_VALUE
+MAX_USED_CONNECTIONS	4.0000000
 SHOW STATUS LIKE 'max_used_connections';
 Variable_name	Value
 Max_used_connections	4
+SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME LIKE
'max_used_connections';
+VARIABLE_NAME	VARIABLE_VALUE
+MAX_USED_CONNECTIONS	5.0000000
 SET GLOBAL thread_cache_size=@save_thread_cache_size;
 show status like 'com_show_status';
 Variable_name	Value
Thread
bk commit into 5.1 tree (lars:1.2336)Lars Thalmann21 Sep