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 Thalmann | 21 Sep |