Below is the list of changes that have just been committed into a local
5.1 repository of kostja. When kostja 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
1.2219 06/06/26 18:45:46 konstantin@stripped +9 -0
Merge bk-internal.mysql.com:/home/bk/mysql-5.1
into mysql.com:/opt/local/work/mysql-5.1-runtime
mysql-test/t/events_microsec.test
1.5 06/06/26 18:45:42 konstantin@stripped +0 -0
SCCS merged
sql/sql_yacc.yy
1.484 06/06/26 18:44:38 konstantin@stripped +0 -0
Auto merged
sql/sql_show.cc
1.354 06/06/26 18:44:38 konstantin@stripped +0 -0
Auto merged
sql/sql_parse.cc
1.564 06/06/26 18:44:38 konstantin@stripped +0 -0
Auto merged
sql/events.cc
1.45 06/06/26 18:44:37 konstantin@stripped +0 -0
Auto merged
sql/mysqld.cc
1.564 06/06/26 18:44:37 konstantin@stripped +0 -0
Auto merged
sql/mysql_priv.h
1.415 06/06/26 18:44:37 konstantin@stripped +0 -0
Auto merged
sql/events.cc
1.44 06/06/26 18:44:37 konstantin@stripped +0 -0
Merge rename: sql/event.cc -> sql/events.cc
sql/CMakeLists.txt
1.23 06/06/26 18:44:37 konstantin@stripped +0 -0
Auto merged
mysql-test/r/information_schema.result
1.126 06/06/26 18:44:37 konstantin@stripped +0 -0
Auto merged
# 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: konstantin
# Host: bodhi.netgear
# Root: /opt/local/work/mysql-5.1-runtime/RESYNC
--- 1.414/sql/mysql_priv.h 2006-06-23 03:49:15 +04:00
+++ 1.415/sql/mysql_priv.h 2006-06-26 18:44:37 +04:00
@@ -1759,6 +1759,8 @@
bool calc_time_diff(TIME *l_time1, TIME *l_time2, int l_sign,
longlong *seconds_out, long *microseconds_out);
+extern LEX_STRING interval_type_to_name[];
+
extern DATE_TIME_FORMAT *date_time_format_make(timestamp_type format_type,
const char *format_str,
uint format_length);
@@ -1774,6 +1776,7 @@
String *str);
void make_time(const DATE_TIME_FORMAT *format, const TIME *l_time,
String *str);
+int my_time_compare(TIME *a, TIME *b);
int test_if_number(char *str,int *res,bool allow_wildcards);
void change_byte(byte *,uint,char,char);
@@ -1791,6 +1794,7 @@
void change_double_for_sort(double nr,byte *to);
double my_double_round(double value, int dec, bool truncate);
int get_quick_record(SQL_SELECT *select);
+
int calc_weekday(long daynr,bool sunday_first_day_of_week);
uint calc_week(TIME *l_time, uint week_behaviour, uint *year);
void find_date(char *pos,uint *vek,uint flag);
--- 1.563/sql/mysqld.cc 2006-06-22 18:59:52 +04:00
+++ 1.564/sql/mysqld.cc 2006-06-26 18:44:37 +04:00
@@ -28,6 +28,10 @@
#include "ha_myisam.h"
+#ifdef HAVE_ROW_BASED_REPLICATION
+#include "rpl_injector.h"
+#endif
+
#ifdef WITH_INNOBASE_STORAGE_ENGINE
#define OPT_INNODB_DEFAULT 1
#else
@@ -112,16 +116,7 @@
#include <sys/utsname.h>
#endif /* __WIN__ */
-#ifdef HAVE_LIBWRAP
-#include <tcpd.h>
-#include <syslog.h>
-#ifdef NEED_SYS_SYSLOG_H
-#include <sys/syslog.h>
-#endif /* NEED_SYS_SYSLOG_H */
-int allow_severity = LOG_INFO;
-int deny_severity = LOG_WARNING;
-
-#endif /* HAVE_LIBWRAP */
+#include <my_libwrap.h>
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
@@ -343,7 +338,7 @@
bool opt_update_log, opt_bin_log;
my_bool opt_log, opt_slow_log;
-uint log_output_options;
+ulong log_output_options;
my_bool opt_log_queries_not_using_indexes= 0;
bool opt_error_log= IF_WIN(1,0);
bool opt_disable_networking=0, opt_skip_show_db=0;
@@ -683,6 +678,8 @@
#endif
#ifdef HAVE_LIBWRAP
const char *libwrapName= NULL;
+int allow_severity = LOG_INFO;
+int deny_severity = LOG_WARNING;
#endif
#ifdef HAVE_QUERY_CACHE
static ulong query_cache_limit= 0;
@@ -1185,6 +1182,9 @@
what they have that is dependent on the binlog
*/
ha_binlog_end(current_thd);
+#ifdef HAVE_ROW_BASED_REPLICATION
+ injector::free_instance();
+#endif
mysql_bin_log.cleanup();
#ifdef HAVE_REPLICATION
@@ -1263,13 +1263,13 @@
MYF(MY_WME | MY_FAE | MY_ALLOW_ZERO_PTR));
DBUG_PRINT("quit", ("Error messages freed"));
/* Tell main we are ready */
+ logger.cleanup_end();
(void) pthread_mutex_lock(&LOCK_thread_count);
DBUG_PRINT("quit", ("got thread count lock"));
ready_to_exit=1;
/* do the broadcast inside the lock to ensure that my_end() is not called */
(void) pthread_cond_broadcast(&COND_thread_count);
(void) pthread_mutex_unlock(&LOCK_thread_count);
- logger.cleanup_end();
/*
The following lines may never be executed as the main thread may have
@@ -3225,7 +3225,7 @@
{
sql_print_error("CSV engine is not present, falling back to the "
"log files");
- log_output_options= log_output_options & ~LOG_TABLE | LOG_FILE;
+ log_output_options= (log_output_options & ~LOG_TABLE) | LOG_FILE;
}
logger.set_handlers(LOG_FILE, opt_slow_log ? log_output_options:LOG_NONE,
@@ -4232,8 +4232,8 @@
struct request_info req;
signal(SIGCHLD, SIG_DFL);
request_init(&req, RQ_DAEMON, libwrapName, RQ_FILE, new_sock, NULL);
- fromhost(&req);
- if (!hosts_access(&req))
+ my_fromhost(&req);
+ if (!my_hosts_access(&req))
{
/*
This may be stupid but refuse() includes an exit(0)
@@ -4241,7 +4241,7 @@
clean_exit() - same stupid thing ...
*/
syslog(deny_severity, "refused connect from %s",
- eval_client(&req));
+ my_eval_client(&req));
/*
C++ sucks (the gibberish in front just translates the supplied
@@ -6953,7 +6953,8 @@
/* Things reset to zero */
opt_skip_slave_start= opt_reckless_slave = 0;
mysql_home[0]= pidfile_name[0]= log_error_file[0]= 0;
- opt_log= opt_update_log= opt_slow_log= 0;
+ opt_log= opt_slow_log= 0;
+ opt_update_log= 0;
log_output_options= find_bit_type(log_output_str, &log_output_typelib);
opt_bin_log= 0;
opt_disable_networking= opt_skip_show_db=0;
--- 1.563/sql/sql_parse.cc 2006-06-22 13:37:44 +04:00
+++ 1.564/sql/sql_parse.cc 2006-06-26 18:44:38 +04:00
@@ -26,7 +26,8 @@
#include "sp_head.h"
#include "sp.h"
#include "sp_cache.h"
-#include "event.h"
+#include "events.h"
+#include "event_timed.h"
#ifdef HAVE_OPENSSL
/*
@@ -3835,7 +3836,9 @@
uint rows_affected= 1;
DBUG_ASSERT(lex->et);
do {
- if (! lex->et->dbname.str)
+ if (! lex->et->dbname.str ||
+ (lex->sql_command == SQLCOM_ALTER_EVENT && lex->spname &&
+ !lex->spname->m_db.str))
{
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
res= true;
@@ -3843,7 +3846,10 @@
}
if (check_access(thd, EVENT_ACL, lex->et->dbname.str, 0, 0, 0,
- is_schema_db(lex->et->dbname.str)))
+ is_schema_db(lex->et->dbname.str)) ||
+ (lex->sql_command == SQLCOM_ALTER_EVENT && lex->spname &&
+ (check_access(thd, EVENT_ACL, lex->spname->m_db.str, 0, 0, 0,
+ is_schema_db(lex->spname->m_db.str)))))
break;
if (end_active_trans(thd))
--- 1.353/sql/sql_show.cc 2006-06-22 13:20:19 +04:00
+++ 1.354/sql/sql_show.cc 2006-06-26 18:44:38 +04:00
@@ -26,13 +26,38 @@
#include "sql_trigger.h"
#include "authors.h"
#include "contributors.h"
-#include "event.h"
+#include "events.h"
+#include "event_timed.h"
#include <my_dir.h>
#ifdef WITH_PARTITION_STORAGE_ENGINE
#include "ha_partition.h"
#endif
+enum enum_i_s_events_fields
+{
+ ISE_EVENT_CATALOG= 0,
+ ISE_EVENT_SCHEMA,
+ ISE_EVENT_NAME,
+ ISE_DEFINER,
+ ISE_EVENT_BODY,
+ ISE_EVENT_DEFINITION,
+ ISE_EVENT_TYPE,
+ ISE_EXECUTE_AT,
+ ISE_INTERVAL_VALUE,
+ ISE_INTERVAL_FIELD,
+ ISE_SQL_MODE,
+ ISE_STARTS,
+ ISE_ENDS,
+ ISE_STATUS,
+ ISE_ON_COMPLETION,
+ ISE_CREATED,
+ ISE_LAST_ALTERED,
+ ISE_LAST_EXECUTED,
+ ISE_EVENT_COMMENT
+};
+
+
static const char *grant_names[]={
"select","insert","update","delete","create","drop","reload","shutdown",
"process","file","grant","references","index","alter"};
@@ -4116,6 +4141,8 @@
case INTERVAL_SECOND_MICROSECOND:
case INTERVAL_MICROSECOND:
return INTERVAL_MICROSECOND;
+ case INTERVAL_LAST:
+ DBUG_ASSERT(0);
}
DBUG_ASSERT(0);
return INTERVAL_SECOND;
@@ -4171,85 +4198,101 @@
/* ->field[0] is EVENT_CATALOG and is by default NULL */
- sch_table->field[1]->store(et.dbname.str, et.dbname.length, scs);
- sch_table->field[2]->store(et.name.str, et.name.length, scs);
- sch_table->field[3]->store(et.definer.str, et.definer.length, scs);
- sch_table->field[4]->store(et.body.str, et.body.length, scs);
+ sch_table->field[ISE_EVENT_SCHEMA]->
+ store(et.dbname.str, et.dbname.length,scs);
+ sch_table->field[ISE_EVENT_NAME]->
+ store(et.name.str, et.name.length, scs);
+ sch_table->field[ISE_DEFINER]->
+ store(et.definer.str, et.definer.length, scs);
+ sch_table->field[ISE_EVENT_BODY]->
+ store(STRING_WITH_LEN("SQL"), scs);
+ sch_table->field[ISE_EVENT_DEFINITION]->
+ store(et.body.str, et.body.length, scs);
- /* [9] is SQL_MODE */
+ /* SQL_MODE */
{
byte *sql_mode_str;
- ulong sql_mode_len=0;
+ ulong sql_mode_len= 0;
sql_mode_str=
sys_var_thd_sql_mode::symbolic_mode_representation(thd, et.sql_mode,
&sql_mode_len);
- sch_table->field[9]->store((const char*)sql_mode_str, sql_mode_len, scs);
+ sch_table->field[ISE_SQL_MODE]->
+ store((const char*)sql_mode_str, sql_mode_len, scs);
}
if (et.expression)
{
String show_str;
/* type */
- sch_table->field[5]->store(STRING_WITH_LEN("RECURRING"), scs);
+ sch_table->field[ISE_EVENT_TYPE]->store(STRING_WITH_LEN("RECURRING"), scs);
if (Events::reconstruct_interval_expression(&show_str, et.interval,
et.expression))
DBUG_RETURN(1);
- sch_table->field[7]->set_notnull();
- sch_table->field[7]->store(show_str.ptr(), show_str.length(), scs);
+ sch_table->field[ISE_INTERVAL_VALUE]->set_notnull();
+ sch_table->field[ISE_INTERVAL_VALUE]->
+ store(show_str.ptr(), show_str.length(), scs);
LEX_STRING *ival= &interval_type_to_name[et.interval];
- sch_table->field[8]->set_notnull();
- sch_table->field[8]->store(ival->str, ival->length, scs);
+ sch_table->field[ISE_INTERVAL_FIELD]->set_notnull();
+ sch_table->field[ISE_INTERVAL_FIELD]->store(ival->str, ival->length, scs);
- /* starts & ends */
- sch_table->field[10]->set_notnull();
- sch_table->field[10]->store_time(&et.starts, MYSQL_TIMESTAMP_DATETIME);
+ /* starts & ends . STARTS is always set - see sql_yacc.yy */
+ sch_table->field[ISE_STARTS]->set_notnull();
+ sch_table->field[ISE_STARTS]->
+ store_time(&et.starts, MYSQL_TIMESTAMP_DATETIME);
if (!et.ends_null)
{
- sch_table->field[11]->set_notnull();
- sch_table->field[11]->store_time(&et.ends, MYSQL_TIMESTAMP_DATETIME);
+ sch_table->field[ISE_ENDS]->set_notnull();
+ sch_table->field[ISE_ENDS]->
+ store_time(&et.ends, MYSQL_TIMESTAMP_DATETIME);
}
}
else
{
- //type
- sch_table->field[5]->store(STRING_WITH_LEN("ONE TIME"), scs);
+ /* type */
+ sch_table->field[ISE_EVENT_TYPE]->store(STRING_WITH_LEN("ONE TIME"), scs);
- sch_table->field[6]->set_notnull();
- sch_table->field[6]->store_time(&et.execute_at, MYSQL_TIMESTAMP_DATETIME);
+ sch_table->field[ISE_EXECUTE_AT]->set_notnull();
+ sch_table->field[ISE_EXECUTE_AT]->
+ store_time(&et.execute_at, MYSQL_TIMESTAMP_DATETIME);
}
/* status */
if (et.status == Event_timed::ENABLED)
- sch_table->field[12]->store(STRING_WITH_LEN("ENABLED"), scs);
+ sch_table->field[ISE_STATUS]->store(STRING_WITH_LEN("ENABLED"), scs);
else
- sch_table->field[12]->store(STRING_WITH_LEN("DISABLED"), scs);
+ sch_table->field[ISE_STATUS]->store(STRING_WITH_LEN("DISABLED"), scs);
/* on_completion */
if (et.on_completion == Event_timed::ON_COMPLETION_DROP)
- sch_table->field[13]->store(STRING_WITH_LEN("NOT PRESERVE"), scs);
+ sch_table->field[ISE_ON_COMPLETION]->
+ store(STRING_WITH_LEN("NOT PRESERVE"), scs);
else
- sch_table->field[13]->store(STRING_WITH_LEN("PRESERVE"), scs);
+ sch_table->field[ISE_ON_COMPLETION]->
+ store(STRING_WITH_LEN("PRESERVE"), scs);
int not_used=0;
number_to_datetime(et.created, &time, 0, ¬_used);
DBUG_ASSERT(not_used==0);
- sch_table->field[14]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
+ sch_table->field[ISE_CREATED]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
number_to_datetime(et.modified, &time, 0, ¬_used);
DBUG_ASSERT(not_used==0);
- sch_table->field[15]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
+ sch_table->field[ISE_LAST_ALTERED]->
+ store_time(&time, MYSQL_TIMESTAMP_DATETIME);
if (et.last_executed.year)
{
- sch_table->field[16]->set_notnull();
- sch_table->field[16]->store_time(&et.last_executed,MYSQL_TIMESTAMP_DATETIME);
+ sch_table->field[ISE_LAST_EXECUTED]->set_notnull();
+ sch_table->field[ISE_LAST_EXECUTED]->
+ store_time(&et.last_executed, MYSQL_TIMESTAMP_DATETIME);
}
- sch_table->field[17]->store(et.comment.str, et.comment.length, scs);
+ sch_table->field[ISE_EVENT_COMMENT]->
+ store(et.comment.str, et.comment.length, scs);
if (schema_table_store_record(thd, sch_table))
DBUG_RETURN(1);
@@ -5173,7 +5216,8 @@
{"EVENT_SCHEMA", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Db"},
{"EVENT_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Name"},
{"DEFINER", 77, MYSQL_TYPE_STRING, 0, 0, "Definer"},
- {"EVENT_BODY", 65535, MYSQL_TYPE_STRING, 0, 0, 0},
+ {"EVENT_BODY", 8, MYSQL_TYPE_STRING, 0, 0, 0},
+ {"EVENT_DEFINITION", 65535, MYSQL_TYPE_STRING, 0, 0, 0},
{"EVENT_TYPE", 9, MYSQL_TYPE_STRING, 0, 0, "Type"},
{"EXECUTE_AT", 0, MYSQL_TYPE_TIMESTAMP, 0, 1, "Execute at"},
{"INTERVAL_VALUE", 256, MYSQL_TYPE_STRING, 0, 1, "Interval value"},
--- 1.483/sql/sql_yacc.yy 2006-06-20 14:20:28 +04:00
+++ 1.484/sql/sql_yacc.yy 2006-06-26 18:44:38 +04:00
@@ -38,7 +38,7 @@
#include "sp_pcontext.h"
#include "sp_rcontext.h"
#include "sp.h"
-#include "event.h"
+#include "event_timed.h"
#include <myisam.h>
#include <myisammrg.h>
--- 1.4/mysql-test/t/events_microsec.test 2006-06-20 14:20:28 +04:00
+++ 1.5/mysql-test/t/events_microsec.test 2006-06-26 18:45:42 +04:00
@@ -1,3 +1,6 @@
+# Can't test with embedded server that doesn't support grants
+-- source include/not_embedded.inc
+
--disable_warnings
create database if not exists events_test;
--enable_warnings
--- 1.43/sql/event.cc 2006-06-19 13:45:29 +04:00
+++ 1.45/sql/events.cc 2006-06-26 18:44:37 +04:00
@@ -14,8 +14,10 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-#include "event_priv.h"
-#include "event.h"
+#include "mysql_priv.h"
+#include "events_priv.h"
+#include "events.h"
+#include "event_timed.h"
#include "event_scheduler.h"
#include "sp.h"
#include "sp_head.h"
@@ -160,35 +162,11 @@
};
-LEX_STRING interval_type_to_name[] = {
- {(char *) STRING_WITH_LEN("YEAR")},
- {(char *) STRING_WITH_LEN("QUARTER")},
- {(char *) STRING_WITH_LEN("MONTH")},
- {(char *) STRING_WITH_LEN("DAY")},
- {(char *) STRING_WITH_LEN("HOUR")},
- {(char *) STRING_WITH_LEN("MINUTE")},
- {(char *) STRING_WITH_LEN("WEEK")},
- {(char *) STRING_WITH_LEN("SECOND")},
- {(char *) STRING_WITH_LEN("MICROSECOND")},
- {(char *) STRING_WITH_LEN("YEAR_MONTH")},
- {(char *) STRING_WITH_LEN("DAY_HOUR")},
- {(char *) STRING_WITH_LEN("DAY_MINUTE")},
- {(char *) STRING_WITH_LEN("DAY_SECOND")},
- {(char *) STRING_WITH_LEN("HOUR_MINUTE")},
- {(char *) STRING_WITH_LEN("HOUR_SECOND")},
- {(char *) STRING_WITH_LEN("MINUTE_SECOND")},
- {(char *) STRING_WITH_LEN("DAY_MICROSECOND")},
- {(char *) STRING_WITH_LEN("HOUR_MICROSECOND")},
- {(char *) STRING_WITH_LEN("MINUTE_MICROSECOND")},
- {(char *) STRING_WITH_LEN("SECOND_MICROSECOND")}
-};
-
-
/*
Compares 2 LEX strings regarding case.
SYNOPSIS
- my_time_compare()
+ sortcmp_lex_string()
s - first LEX_STRING
t - second LEX_STRING
@@ -211,68 +189,6 @@
/*
- Compares 2 TIME structures
-
- SYNOPSIS
- my_time_compare()
-
- a - first TIME
- b - second time
-
- RETURN VALUE
- -1 - a < b
- 0 - a == b
- 1 - a > b
-
- NOTES
- TIME.second_part is not considered during comparison
-*/
-
-int
-my_time_compare(TIME *a, TIME *b)
-{
- my_ulonglong a_t= TIME_to_ulonglong_datetime(a);
- my_ulonglong b_t= TIME_to_ulonglong_datetime(b);
-
- if (a_t > b_t)
- return 1;
- else if (a_t < b_t)
- return -1;
-
- return 0;
-}
-
-
-/*
- Compares the execute_at members of 2 Event_timed instances.
- Used as callback for the prioritized queue when shifting
- elements inside.
-
- SYNOPSIS
- event_timed_compare()
-
- vptr - not used (set it to NULL)
- a - first Event_timed object
- b - second Event_timed object
-
- RETURNS:
- -1 - a->execute_at < b->execute_at
- 0 - a->execute_at == b->execute_at
- 1 - a->execute_at > b->execute_at
-
- Notes
- execute_at.second_part is not considered during comparison
-*/
-
-int
-event_timed_compare_q(void *vptr, byte* a, byte *b)
-{
- return my_time_compare(&((Event_timed *)a)->execute_at,
- &((Event_timed *)b)->execute_at);
-}
-
-
-/*
Reconstructs interval expression from interval type and expression
value that is in form of a value of the smalles entity:
For
@@ -1002,7 +918,8 @@
rows_affected)))
{
Event_scheduler *scheduler= Event_scheduler::get_instance();
- if (scheduler->initialized() && (ret= scheduler->add_event(thd, et, true)))
+ if (scheduler->initialized() &&
+ (ret= scheduler->create_event(thd, et, true)))
my_error(ER_EVENT_MODIFY_QUEUE_ERROR, MYF(0), ret);
}
/* No need to close the table, it will be closed in sql_parse::do_command */
@@ -1047,7 +964,7 @@
{
Event_scheduler *scheduler= Event_scheduler::get_instance();
if (scheduler->initialized() &&
- (ret= scheduler->replace_event(thd, et,
+ (ret= scheduler->update_event(thd, et,
new_name? &new_name->m_db: NULL,
new_name? &new_name->m_name: NULL)))
my_error(ER_EVENT_MODIFY_QUEUE_ERROR, MYF(0), ret);
--- 1.125/mysql-test/r/information_schema.result 2006-06-20 14:20:27 +04:00
+++ 1.126/mysql-test/r/information_schema.result 2006-06-26 18:44:37 +04:00
@@ -756,7 +756,7 @@
where data_type = 'longtext';
table_schema table_name column_name
information_schema COLUMNS COLUMN_TYPE
-information_schema EVENTS EVENT_BODY
+information_schema EVENTS EVENT_DEFINITION
information_schema EVENTS SQL_MODE
information_schema PARTITIONS PARTITION_EXPRESSION
information_schema PARTITIONS SUBPARTITION_EXPRESSION
--- 1.22/sql/CMakeLists.txt 2006-06-09 01:06:35 +04:00
+++ 1.23/sql/CMakeLists.txt 2006-06-26 18:44:37 +04:00
@@ -53,7 +53,7 @@
time.cc tztime.cc uniques.cc unireg.cc item_xmlfunc.cc
rpl_tblmap.cc sql_binlog.cc event_scheduler.cc event_timed.cc
sql_tablespace.cc events.cc ../sql-common/my_user.c
- partition_info.cc
+ partition_info.cc rpl_injector.cc
${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc
${PROJECT_SOURCE_DIR}/sql/sql_yacc.h
${PROJECT_SOURCE_DIR}/include/mysqld_error.h
| Thread |
|---|
| • bk commit into 5.1 tree (konstantin:1.2219) | konstantin | 26 Jun |