List:Commits« Previous MessageNext Message »
From:Sergey Glukhov Date:March 12 2010 3:58pm
Subject:bzr commit into mysql-pe branch (Sergey.Glukhov:3968) Bug#48729
View as plain text  
#At file:///home/gluh/MySQL/mysql-pe-bug-48729/ based on revid:sergey.glukhov@stripped

 3968 Sergey Glukhov	2010-03-12
      Bug#48729 SELECT ... FROM INFORMATION_SCHEMA.ROUTINES causes memory to grow
      Analysis showed that in case of accessing I_S tables for
      ROUTINES, PARAMETERS, EVENTS we perform unnecessary allocations
      with get_field() function for every processed row that
      in their turn causes significant memory growth.
      The fix is to avoid use of get_field().
     @ sql/event_db_repository.cc
        added new parameter
     @ sql/sql_show.cc
        Functions store_schema_params(), store_schema_proc(),
        copy_event_to_schema_table() are changed to avoid
        use of get_field() function.
     @ sql/sql_show.h
        added new parameter

    modified:
      sql/event_db_repository.cc
      sql/sql_show.cc
      sql/sql_show.h
=== modified file 'sql/event_db_repository.cc'
--- a/sql/event_db_repository.cc	2010-02-26 14:25:52 +0000
+++ b/sql/event_db_repository.cc	2010-03-12 14:58:40 +0000
@@ -394,6 +394,7 @@ Event_db_repository::index_read_for_db_f
   KEY *key_info;
   uint key_len;
   uchar *key_buf= NULL;
+  String tmp_string;
   LINT_INIT(key_buf);
 
   DBUG_ENTER("Event_db_repository::index_read_for_db_for_i_s");
@@ -427,9 +428,11 @@ Event_db_repository::index_read_for_db_f
                                                HA_READ_PREFIX)))
   {
     DBUG_PRINT("info",("Found rows. Let's retrieve them. ret=%d", ret));
+    tmp_string.set_charset(system_charset_info);
     do
     {
-      ret= copy_event_to_schema_table(thd, schema_table, event_table);
+      ret= copy_event_to_schema_table(thd, schema_table, event_table,
+                                      &tmp_string);
       if (ret == 0)
         ret= event_table->file->index_next_same(event_table->record[0],
                                                 key_buf, key_len);
@@ -470,6 +473,7 @@ Event_db_repository::table_scan_all_for_
 {
   int ret;
   READ_RECORD read_record_info;
+  String tmp_string;
   DBUG_ENTER("Event_db_repository::table_scan_all_for_i_s");
 
   init_read_record(&read_record_info, thd, event_table, NULL, 1, 0, FALSE);
@@ -479,11 +483,13 @@ Event_db_repository::table_scan_all_for_
     but rr_handle_error returns -1 for that reason. Thus, read_record()
     returns -1 eventually.
   */
+  tmp_string.set_charset(system_charset_info);
   do
   {
     ret= read_record_info.read_record(&read_record_info);
     if (ret == 0)
-      ret= copy_event_to_schema_table(thd, schema_table, event_table);
+      ret= copy_event_to_schema_table(thd, schema_table, event_table,
+                                      &tmp_string);
   } while (ret == 0);
 
   DBUG_PRINT("info", ("Scan finished. ret=%d", ret));

=== modified file 'sql/sql_show.cc'
--- a/sql/sql_show.cc	2010-02-25 15:47:36 +0000
+++ b/sql/sql_show.cc	2010-03-12 14:58:40 +0000
@@ -31,6 +31,7 @@
 #ifdef HAVE_EVENT_SCHEDULER
 #include "events.h"
 #include "event_data_objects.h"
+#include "event_db_repository.h"
 #endif
 #include <my_dir.h>
 #include "debug_sync.h"
@@ -4483,6 +4484,13 @@ int fill_schema_coll_charset_app(THD *th
 }
 
 
+static void store_field_value_to_buff(Field *field, String *buff)
+{
+  buff->length(0);
+  field->val_str(buff); 
+}
+
+
 /**
   @brief Store record into I_S.PARAMETERS table
 
@@ -4502,14 +4510,14 @@ int fill_schema_coll_charset_app(THD *th
 
 bool store_schema_params(THD *thd, TABLE *table, TABLE *proc_table,
                          const char *wild, bool full_access,
-                         const char *sp_user)
+                         const char *sp_user, String *tmp_string)
 {
   TABLE_SHARE share;
   TABLE tbl;
   CHARSET_INFO *cs= system_charset_info;
   char params_buff[MAX_FIELD_WIDTH], returns_buff[MAX_FIELD_WIDTH],
-    sp_db_buff[NAME_LEN], sp_name_buff[NAME_LEN], path[FN_REFLEN],
-    definer_buff[USERNAME_LENGTH + HOSTNAME_LENGTH + 1];
+    sp_db_buff[NAME_LEN + 1], sp_name_buff[NAME_LEN + 1], path[FN_REFLEN],
+    definer_buff[USERNAME_LENGTH + HOSTNAME_LENGTH + 2];
   String params(params_buff, sizeof(params_buff), cs);
   String returns(returns_buff, sizeof(returns_buff), cs);
   String sp_db(sp_db_buff, sizeof(sp_db_buff), cs);
@@ -4524,25 +4532,24 @@ bool store_schema_params(THD *thd, TABLE
   (void) build_table_filename(path, sizeof(path), "", "", "", 0);
   init_tmp_table_share(thd, &share, "", 0, "", path);
 
-  get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_DB], &sp_db);
-  get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_NAME], &sp_name);
-  get_field(thd->mem_root,proc_table->field[MYSQL_PROC_FIELD_DEFINER],&definer);
+  store_field_value_to_buff(proc_table->field[MYSQL_PROC_FIELD_DB], &sp_db);
+  store_field_value_to_buff(proc_table->field[MYSQL_PROC_FIELD_NAME], &sp_name);
+  store_field_value_to_buff(proc_table->field[MYSQL_PROC_FIELD_DEFINER],
+                            &definer);
   routine_type= (uint) proc_table->field[MYSQL_PROC_MYSQL_TYPE]->val_int();
 
   if (!full_access)
-    full_access= !strcmp(sp_user, definer.ptr());
+    full_access= !strcmp(sp_user, definer.c_ptr_safe());
   if (!full_access &&
-      check_some_routine_access(thd, sp_db.ptr(),sp_name.ptr(),
+      check_some_routine_access(thd, sp_db.c_ptr_safe(),sp_name.c_ptr_safe(),
                                 routine_type == TYPE_ENUM_PROCEDURE))
     DBUG_RETURN(0);
 
-  params.length(0);
-  get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_PARAM_LIST],
-            &params);
+  store_field_value_to_buff(proc_table->field[MYSQL_PROC_FIELD_PARAM_LIST],
+                            &params);
   returns.length(0);
   if (routine_type == TYPE_ENUM_FUNCTION)
-    get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_RETURNS],
-              &returns);
+    proc_table->field[MYSQL_PROC_FIELD_RETURNS]->val_str(&returns);
 
   sp= sp_load_for_information_schema(thd, proc_table, &sp_db, &sp_name,
                                      (ulong) proc_table->
@@ -4556,7 +4563,6 @@ bool store_schema_params(THD *thd, TABLE
   {
     Field *field;
     Create_field *field_def;
-    String tmp_string;
     if (routine_type == TYPE_ENUM_FUNCTION)
     {
       restore_record(table, s->default_values);
@@ -4564,9 +4570,9 @@ bool store_schema_params(THD *thd, TABLE
       table->field[1]->store(sp_db.ptr(), sp_db.length(), cs);
       table->field[2]->store(sp_name.ptr(), sp_name.length(), cs);
       table->field[3]->store((longlong) 0, TRUE);
-      get_field(thd->mem_root, proc_table->field[MYSQL_PROC_MYSQL_TYPE],
-                &tmp_string);
-      table->field[14]->store(tmp_string.ptr(), tmp_string.length(), cs);
+      store_field_value_to_buff(proc_table->field[MYSQL_PROC_MYSQL_TYPE],
+                                tmp_string);
+      table->field[14]->store(tmp_string->ptr(), tmp_string->length(), cs);
       field_def= &sp->m_return_field_def;
       field= make_field(&share, (uchar*) 0, field_def->length,
                         (uchar*) "", 0, field_def->pack_flag,
@@ -4617,9 +4623,9 @@ bool store_schema_params(THD *thd, TABLE
       table->field[4]->set_notnull();
       table->field[5]->store(spvar->name.str, spvar->name.length, cs);
       table->field[5]->set_notnull();
-      get_field(thd->mem_root, proc_table->field[MYSQL_PROC_MYSQL_TYPE],
-                &tmp_string);
-      table->field[14]->store(tmp_string.ptr(), tmp_string.length(), cs);
+      store_field_value_to_buff(proc_table->field[MYSQL_PROC_MYSQL_TYPE],
+                                tmp_string);
+      table->field[14]->store(tmp_string->ptr(), tmp_string->length(), cs);
 
       field= make_field(&share, (uchar*) 0, field_def->length,
                         (uchar*) "", 0, field_def->pack_flag,
@@ -4647,20 +4653,28 @@ bool store_schema_params(THD *thd, TABLE
 
 
 bool store_schema_proc(THD *thd, TABLE *table, TABLE *proc_table,
-                       const char *wild, bool full_access, const char *sp_user)
+                       const char *wild, bool full_access, const char *sp_user,
+                       String *tmp_string)
 {
-  String tmp_string;
-  String sp_db, sp_name, definer;
+  CHARSET_INFO *cs= system_charset_info;
+  char sp_db_buff[NAME_LEN + 1], sp_name_buff[NAME_LEN + 1],
+       definer_buff[USERNAME_LENGTH + HOSTNAME_LENGTH + 2];
+
+  String sp_db(sp_db_buff, sizeof(sp_db_buff), cs);
+  String sp_name(sp_name_buff, sizeof(sp_name_buff), cs);
+  String definer(definer_buff, sizeof(definer_buff), cs);
+
   MYSQL_TIME time;
   LEX *lex= thd->lex;
-  CHARSET_INFO *cs= system_charset_info;
-  get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_DB], &sp_db);
-  get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_NAME], &sp_name);
-  get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_DEFINER],&definer);
+
+  proc_table->field[MYSQL_PROC_FIELD_DB]->val_str(&sp_db);
+  proc_table->field[MYSQL_PROC_FIELD_NAME]->val_str(&sp_name);
+  proc_table->field[MYSQL_PROC_FIELD_DEFINER]->val_str(&definer);
+
   if (!full_access)
-    full_access= !strcmp(sp_user, definer.ptr());
+    full_access= !strcmp(sp_user, definer.c_ptr_safe());
   if (!full_access && 
-      check_some_routine_access(thd, sp_db.ptr(), sp_name.ptr(),
+      check_some_routine_access(thd, sp_db.c_ptr_safe(), sp_name.c_ptr_safe(),
                                 proc_table->field[MYSQL_PROC_MYSQL_TYPE]->
                                 val_int() == TYPE_ENUM_PROCEDURE))
     return 0;
@@ -4674,32 +4688,32 @@ bool store_schema_proc(THD *thd, TABLE *
       (sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND) == 0)
   {
     restore_record(table, s->default_values);
-    if (!wild || !wild[0] || !wild_compare(sp_name.ptr(), wild, 0))
+    if (!wild || !wild[0] || !wild_compare(sp_name.c_ptr_safe(), wild, 0))
     {
       int enum_idx= (int) proc_table->field[MYSQL_PROC_FIELD_ACCESS]->val_int();
       table->field[3]->store(sp_name.ptr(), sp_name.length(), cs);
-      get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_SPECIFIC_NAME],
-                &tmp_string);
-      table->field[0]->store(tmp_string.ptr(), tmp_string.length(), cs);
+      store_field_value_to_buff(proc_table->
+                                field[MYSQL_PROC_FIELD_SPECIFIC_NAME],
+                                tmp_string);
+      table->field[0]->store(tmp_string->ptr(), tmp_string->length(), cs);
       table->field[1]->store(STRING_WITH_LEN("def"), cs);
       table->field[2]->store(sp_db.ptr(), sp_db.length(), cs);
-      get_field(thd->mem_root, proc_table->field[MYSQL_PROC_MYSQL_TYPE],
-                &tmp_string);
-      table->field[4]->store(tmp_string.ptr(), tmp_string.length(), cs);
+      store_field_value_to_buff(proc_table->field[MYSQL_PROC_MYSQL_TYPE],
+                                tmp_string);
+      table->field[4]->store(tmp_string->ptr(), tmp_string->length(), cs);
       if (proc_table->field[MYSQL_PROC_MYSQL_TYPE]->val_int() ==
           TYPE_ENUM_FUNCTION)
       {
         sp_head *sp;
         bool free_sp_head;
-        get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_RETURNS],
-                  &tmp_string);
-
+        store_field_value_to_buff(proc_table->field[MYSQL_PROC_FIELD_RETURNS],
+                                  tmp_string);
         sp= sp_load_for_information_schema(thd, proc_table, &sp_db, &sp_name,
                                            (ulong) proc_table->
                                            field[MYSQL_PROC_FIELD_SQL_MODE]->
                                            val_int(),
                                            TYPE_ENUM_FUNCTION,
-                                           tmp_string.c_ptr_safe(),
+                                           tmp_string->c_ptr_safe(),
                                            "", &free_sp_head);
 
         if (sp)
@@ -4730,24 +4744,23 @@ bool store_schema_proc(THD *thd, TABLE *
 
       if (full_access)
       {
-        get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_BODY_UTF8],
-                  &tmp_string);
-        table->field[14]->store(tmp_string.ptr(), tmp_string.length(), cs);
+        store_field_value_to_buff(proc_table->field[MYSQL_PROC_FIELD_BODY_UTF8],
+                                  tmp_string);  
+        table->field[14]->store(tmp_string->ptr(), tmp_string->length(), cs);
         table->field[14]->set_notnull();
       }
       table->field[13]->store(STRING_WITH_LEN("SQL"), cs);
       table->field[17]->store(STRING_WITH_LEN("SQL"), cs);
-
-
-      get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_DETERMINISTIC],
-                &tmp_string);
-      table->field[18]->store(tmp_string.ptr(), tmp_string.length(), cs);
+      store_field_value_to_buff(proc_table->
+                                field[MYSQL_PROC_FIELD_DETERMINISTIC],
+                                tmp_string);
+      table->field[18]->store(tmp_string->ptr(), tmp_string->length(), cs);
       table->field[19]->store(sp_data_access_name[enum_idx].str, 
                               sp_data_access_name[enum_idx].length , cs);
-
-      get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_SECURITY_TYPE],
-                &tmp_string);
-      table->field[21]->store(tmp_string.ptr(), tmp_string.length(), cs);
+      store_field_value_to_buff(proc_table->
+                                field[MYSQL_PROC_FIELD_SECURITY_TYPE],
+                                tmp_string);
+      table->field[21]->store(tmp_string->ptr(), tmp_string->length(), cs);
       bzero((char *)&time, sizeof(time));
       ((Field_timestamp *) proc_table->field[MYSQL_PROC_FIELD_CREATED])->
         get_time(&time);
@@ -4756,29 +4769,25 @@ bool store_schema_proc(THD *thd, TABLE *
       ((Field_timestamp *) proc_table->field[MYSQL_PROC_FIELD_MODIFIED])->
         get_time(&time);
       table->field[23]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
-
-      get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_SQL_MODE],
-                &tmp_string);
-      table->field[24]->store(tmp_string.ptr(), tmp_string.length(), cs);
-
-      get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_COMMENT],
-                &tmp_string);
-      table->field[25]->store(tmp_string.ptr(), tmp_string.length(), cs);
+      store_field_value_to_buff(proc_table->field[MYSQL_PROC_FIELD_SQL_MODE],
+                                tmp_string);
+      table->field[24]->store(tmp_string->ptr(), tmp_string->length(), cs);
+      store_field_value_to_buff(proc_table->field[MYSQL_PROC_FIELD_COMMENT],
+                                tmp_string);
+      table->field[25]->store(tmp_string->ptr(), tmp_string->length(), cs);
       table->field[26]->store(definer.ptr(), definer.length(), cs);
-
-      get_field(thd->mem_root,
-                proc_table->field[MYSQL_PROC_FIELD_CHARACTER_SET_CLIENT],
-                &tmp_string);
-      table->field[27]->store(tmp_string.ptr(), tmp_string.length(), cs);
-
-      get_field(thd->mem_root,
-                proc_table->field[ MYSQL_PROC_FIELD_COLLATION_CONNECTION],
-                &tmp_string);
-      table->field[28]->store(tmp_string.ptr(), tmp_string.length(), cs);
-
-      get_field(thd->mem_root, proc_table->field[MYSQL_PROC_FIELD_DB_COLLATION],
-                &tmp_string);
-      table->field[29]->store(tmp_string.ptr(), tmp_string.length(), cs);
+      store_field_value_to_buff(proc_table->
+                                field[MYSQL_PROC_FIELD_CHARACTER_SET_CLIENT],
+                                tmp_string);
+      table->field[27]->store(tmp_string->ptr(), tmp_string->length(), cs);
+      store_field_value_to_buff(proc_table->
+                                field[ MYSQL_PROC_FIELD_COLLATION_CONNECTION],
+                                tmp_string);
+      table->field[28]->store(tmp_string->ptr(), tmp_string->length(), cs);
+      store_field_value_to_buff(proc_table->
+                                field[MYSQL_PROC_FIELD_DB_COLLATION],
+                                tmp_string);
+      table->field[29]->store(tmp_string->ptr(), tmp_string->length(), cs);
 
       return schema_table_store_record(thd, table);
     }
@@ -4799,6 +4808,7 @@ int fill_schema_proc(THD *thd, TABLE_LIS
   Open_tables_backup open_tables_state_backup;
   enum enum_schema_tables schema_table_idx=
     get_schema_table_idx(tables->schema_table);
+  String tmp_string;
   DBUG_ENTER("fill_schema_proc");
 
   strxmov(definer, thd->security_ctx->priv_user, "@",
@@ -4822,9 +4832,12 @@ int fill_schema_proc(THD *thd, TABLE_LIS
     goto err;
   }
 
+  tmp_string.set_charset(system_charset_info);
   if (schema_table_idx == SCH_PROCEDURES ?
-      store_schema_proc(thd, table, proc_table, wild, full_access, definer) :
-      store_schema_params(thd, table, proc_table, wild, full_access, definer))
+      store_schema_proc(thd, table, proc_table, wild, full_access, definer,
+                        &tmp_string) :
+      store_schema_params(thd, table, proc_table, wild, full_access, definer,
+                          &tmp_string))
   {
     res= 1;
     goto err;
@@ -4832,8 +4845,10 @@ int fill_schema_proc(THD *thd, TABLE_LIS
   while (!proc_table->file->index_next(proc_table->record[0]))
   {
     if (schema_table_idx == SCH_PROCEDURES ?
-        store_schema_proc(thd, table, proc_table, wild, full_access, definer): 
-        store_schema_params(thd, table, proc_table, wild, full_access, definer))
+        store_schema_proc(thd, table, proc_table, wild, full_access, definer,
+                          &tmp_string):
+        store_schema_params(thd, table, proc_table, wild, full_access, definer,
+                            &tmp_string))
     {
       res= 1;
       goto err;
@@ -5852,6 +5867,22 @@ static interval_type get_real_interval_t
 #endif
 
 #ifdef HAVE_EVENT_SCHEDULER
+
+static void copy_datetime(Field *dst, Field *src, Time_zone *time_zone)
+{
+  my_time_t time_in_seconds;
+  MYSQL_TIME time;
+  my_bool not_used= FALSE;
+  bzero((char *)&time, sizeof(time));
+  src->get_date(&time, TIME_NO_ZERO_DATE);
+  time_in_seconds= my_tz_OFFSET0->TIME_to_gmt_sec(&time, &not_used);
+  bzero((char *)&time, sizeof(time));
+  time_zone->gmt_sec_to_TIME(&time, time_in_seconds);
+  dst->set_notnull();
+  dst->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
+}
+
+
 /*
   Loads an event from mysql.event and copies it's data to a row of
   I_S.EVENTS
@@ -5868,24 +5899,35 @@ static interval_type get_real_interval_t
 */
 
 int
-copy_event_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table)
+copy_event_to_schema_table(THD *thd, TABLE *sch_table,
+                           TABLE *event_table, String *tmp_string)
 {
+  char event_db_buff[NAME_LEN + 1], event_name_buff[NAME_LEN + 1],
+       definer_buff[USERNAME_LENGTH + HOSTNAME_LENGTH + 2];
   const char *wild= thd->lex->wild ? thd->lex->wild->ptr() : NullS;
   CHARSET_INFO *scs= system_charset_info;
   MYSQL_TIME time;
-  Event_timed et;
+  Time_zone *time_zone;
+  String event_db(event_db_buff, sizeof(event_db_buff), scs);
+  String event_name(event_name_buff, sizeof(event_name_buff), scs);
+  String definer(definer_buff, sizeof(definer_buff), scs);
   DBUG_ENTER("copy_event_to_schema_table");
 
-  restore_record(sch_table, s->default_values);
 
-  if (et.load_from_row(thd, event_table))
+  if (event_table->s->fields < ET_FIELD_COUNT)
   {
     my_error(ER_CANNOT_LOAD_FROM_TABLE, MYF(0), event_table->alias);
     DBUG_RETURN(1);
   }
 
-  if (!(!wild || !wild[0] || !wild_compare(et.name.str, wild, 0)))
-    DBUG_RETURN(0);
+  restore_record(sch_table, s->default_values);
+
+  event_table->field[ET_FIELD_DB]->val_str(&event_db);
+  event_table->field[ET_FIELD_NAME]->val_str(&event_name);
+  event_table->field[ET_FIELD_DEFINER]->val_str(&definer);
+
+  if (!(!wild || !wild[0] || !wild_compare(event_name.c_ptr_safe(), wild, 0)))
+    DBUG_RETURN(FALSE);
 
   /*
     Skip events in schemas one does not have access to. The check is
@@ -5893,147 +5935,135 @@ copy_event_to_schema_table(THD *thd, TAB
     has access.
   */
   if (thd->lex->sql_command != SQLCOM_SHOW_EVENTS &&
-      check_access(thd, EVENT_ACL, et.dbname.str, NULL, NULL, 0, 1))
-    DBUG_RETURN(0);
+      check_access(thd, EVENT_ACL, event_db.c_ptr_safe(), NULL, NULL, 0, 1))
+    DBUG_RETURN(FALSE);
 
-  /* ->field[0] is EVENT_CATALOG and is by default NULL */
   sch_table->field[ISE_EVENT_CATALOG]->store(STRING_WITH_LEN("def"), 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);
-  const String *tz_name= et.time_zone->get_name();
-  sch_table->field[ISE_TIME_ZONE]->
-                                store(tz_name->ptr(), tz_name->length(), scs);
-  sch_table->field[ISE_EVENT_BODY]->
-                                store(STRING_WITH_LEN("SQL"), scs);
-  sch_table->field[ISE_EVENT_DEFINITION]->store(
-    et.body_utf8.str, et.body_utf8.length, scs);
+  sch_table->field[ISE_EVENT_SCHEMA]->store(event_db.ptr(),
+                                            event_db.length(),scs);
+  sch_table->field[ISE_EVENT_NAME]->store(event_name.ptr(),
+                                          event_name.length(), scs);
+  sch_table->field[ISE_DEFINER]->store(definer.ptr(), definer.length(), scs);
 
-  /* SQL_MODE */
+
+  store_field_value_to_buff(event_table->field[ET_FIELD_TIME_ZONE], tmp_string);
+  sch_table->field[ISE_TIME_ZONE]->store(tmp_string->ptr(),
+                                         tmp_string->length(), scs);
+  if (!(time_zone= my_tz_find(thd, tmp_string)))
   {
-    LEX_STRING sql_mode;
-    sql_mode_string_representation(thd, et.sql_mode, &sql_mode);
-    sch_table->field[ISE_SQL_MODE]->
-                                store(sql_mode.str, sql_mode.length, scs);
+    my_error(ER_CANNOT_LOAD_FROM_TABLE, MYF(0), event_table->alias);
+    DBUG_RETURN(FALSE);
   }
+  sch_table->field[ISE_EVENT_BODY]->store(STRING_WITH_LEN("SQL"), scs);  
+  store_field_value_to_buff(event_table->field[ET_FIELD_BODY_UTF8], tmp_string);
+  sch_table->field[ISE_EVENT_DEFINITION]->store(tmp_string->ptr(),
+                                                tmp_string->length(), scs);
 
-  int not_used=0;
-
-  if (et.expression)
+  /* SQL_MODE */
+  store_field_value_to_buff(event_table->field[ET_FIELD_SQL_MODE], tmp_string);
+  sch_table->field[ISE_SQL_MODE]->store(tmp_string->ptr(),
+                                        tmp_string->length(), scs);
+  longlong expression= event_table->field[ET_FIELD_INTERVAL_EXPR]->val_int();
+  if (!event_table->field[ET_FIELD_INTERVAL_EXPR]->is_null())
   {
-    String show_str;
     /* type */
     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[ISE_INTERVAL_VALUE]->set_notnull();
-    sch_table->field[ISE_INTERVAL_VALUE]->
-                                store(show_str.ptr(), show_str.length(), scs);
+    interval_type interval;
+    store_field_value_to_buff(event_table->field[ET_FIELD_TRANSIENT_INTERVAL],
+                              tmp_string);
+    if (!event_table->field[ET_FIELD_TRANSIENT_INTERVAL]->is_null())
+    {
+      int i;
+      LEX_STRING tmp;
+   
+      tmp.length= tmp_string->length();
+      tmp.str= tmp_string->c_ptr_safe();
+      i= find_string_in_array(interval_type_to_name, &tmp, system_charset_info);
+      if (i < 0)
+        DBUG_RETURN(TRUE);
+      interval= (interval_type) i;
+      tmp_string->length(0);
+      if (Events::reconstruct_interval_expression(tmp_string, interval,
+                                                  expression))
+        DBUG_RETURN(TRUE);
+      sch_table->field[ISE_INTERVAL_VALUE]->set_notnull();
+      sch_table->field[ISE_INTERVAL_VALUE]->store(tmp_string->ptr(),
+                                                  tmp_string->length(), scs);
+    }
 
-    LEX_STRING *ival= &interval_type_to_name[et.interval];
+    LEX_STRING *ival= &interval_type_to_name[interval];
     sch_table->field[ISE_INTERVAL_FIELD]->set_notnull();
     sch_table->field[ISE_INTERVAL_FIELD]->store(ival->str, ival->length, scs);
 
     /* starts & ends . STARTS is always set - see sql_yacc.yy */
-    et.time_zone->gmt_sec_to_TIME(&time, et.starts);
-    sch_table->field[ISE_STARTS]->set_notnull();
-    sch_table->field[ISE_STARTS]->
-                                store_time(&time, MYSQL_TIMESTAMP_DATETIME);
-
-    if (!et.ends_null)
-    {
-      et.time_zone->gmt_sec_to_TIME(&time, et.ends);
-      sch_table->field[ISE_ENDS]->set_notnull();
-      sch_table->field[ISE_ENDS]->
-                                store_time(&time, MYSQL_TIMESTAMP_DATETIME);
-    }
+    copy_datetime(sch_table->field[ISE_STARTS],
+                  event_table->field[ET_FIELD_STARTS], time_zone);
+    if (!event_table->field[ET_FIELD_ENDS]->is_null())
+      copy_datetime(sch_table->field[ISE_ENDS],
+                    event_table->field[ET_FIELD_ENDS], time_zone);
   }
   else
   {
     /* type */
     sch_table->field[ISE_EVENT_TYPE]->store(STRING_WITH_LEN("ONE TIME"), scs);
-
-    et.time_zone->gmt_sec_to_TIME(&time, et.execute_at);
-    sch_table->field[ISE_EXECUTE_AT]->set_notnull();
-    sch_table->field[ISE_EXECUTE_AT]->
-                          store_time(&time, MYSQL_TIMESTAMP_DATETIME);
+    /*executed at*/
+    copy_datetime(sch_table->field[ISE_EXECUTE_AT],
+                  event_table->field[ET_FIELD_EXECUTE_AT], time_zone);
   }
 
   /* status */
-
-  switch (et.status)
-  {
-    case Event_parse_data::ENABLED:
-      sch_table->field[ISE_STATUS]->store(STRING_WITH_LEN("ENABLED"), scs);
-      break;
-    case Event_parse_data::SLAVESIDE_DISABLED:
-      sch_table->field[ISE_STATUS]->store(STRING_WITH_LEN("SLAVESIDE_DISABLED"),
-                                          scs);
-      break;
-    case Event_parse_data::DISABLED:
-      sch_table->field[ISE_STATUS]->store(STRING_WITH_LEN("DISABLED"), scs);
-      break;
-    default:
-      DBUG_ASSERT(0);
-  }
-  sch_table->field[ISE_ORIGINATOR]->store(et.originator, TRUE);
-
+  store_field_value_to_buff(event_table->field[ET_FIELD_STATUS], tmp_string);
+  sch_table->field[ISE_STATUS]->store(tmp_string->ptr(),
+                                      tmp_string->length(), scs);
+  sch_table->field[ISE_ORIGINATOR]->store(event_table->
+                                          field[ET_FIELD_ORIGINATOR]->val_int(),
+                                          TRUE);
   /* on_completion */
-  if (et.on_completion == Event_parse_data::ON_COMPLETION_DROP)
+  if (event_table->field[ET_FIELD_ON_COMPLETION]->val_int() ==
+      Event_parse_data::ON_COMPLETION_DROP)
     sch_table->field[ISE_ON_COMPLETION]->
                                 store(STRING_WITH_LEN("NOT PRESERVE"), scs);
   else
     sch_table->field[ISE_ON_COMPLETION]->
                                 store(STRING_WITH_LEN("PRESERVE"), scs);
 
-  number_to_datetime(et.created, &time, 0, &not_used);
-  DBUG_ASSERT(not_used==0);
+  bzero((char *)&time, sizeof(time));
+  ((Field_timestamp *) event_table->field[ET_FIELD_CREATED])->get_time(&time);
   sch_table->field[ISE_CREATED]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
-
-  number_to_datetime(et.modified, &time, 0, &not_used);
-  DBUG_ASSERT(not_used==0);
-  sch_table->field[ISE_LAST_ALTERED]->
-                                store_time(&time, MYSQL_TIMESTAMP_DATETIME);
-
-  if (et.last_executed)
-  {
-    et.time_zone->gmt_sec_to_TIME(&time, et.last_executed);
-    sch_table->field[ISE_LAST_EXECUTED]->set_notnull();
-    sch_table->field[ISE_LAST_EXECUTED]->
-                       store_time(&time, MYSQL_TIMESTAMP_DATETIME);
-  }
-
-  sch_table->field[ISE_EVENT_COMMENT]->
-                      store(et.comment.str, et.comment.length, scs);
-
+  bzero((char *)&time, sizeof(time));
+  ((Field_timestamp *) event_table->field[ET_FIELD_MODIFIED])->get_time(&time);
+  sch_table->field[ISE_LAST_ALTERED]->store_time(&time,
+                                                 MYSQL_TIMESTAMP_DATETIME);
+
+  if (!event_table->field[ET_FIELD_LAST_EXECUTED]->is_null())
+    copy_datetime(sch_table->field[ISE_LAST_EXECUTED],
+                  event_table->field[ET_FIELD_LAST_EXECUTED], time_zone);
+
+  store_field_value_to_buff(event_table->field[ET_FIELD_COMMENT], tmp_string);
+  sch_table->field[ISE_EVENT_COMMENT]->store(tmp_string->ptr(),
+                                             tmp_string->length(), scs);
   sch_table->field[ISE_CLIENT_CS]->set_notnull();
-  sch_table->field[ISE_CLIENT_CS]->store(
-    et.creation_ctx->get_client_cs()->csname,
-    strlen(et.creation_ctx->get_client_cs()->csname),
-    scs);
+  store_field_value_to_buff(event_table->field[ET_FIELD_CHARACTER_SET_CLIENT],
+                            tmp_string);
+  sch_table->field[ISE_CLIENT_CS]->store(tmp_string->ptr(),
+                                         tmp_string->length(), scs);
 
   sch_table->field[ISE_CONNECTION_CL]->set_notnull();
-  sch_table->field[ISE_CONNECTION_CL]->store(
-    et.creation_ctx->get_connection_cl()->name,
-    strlen(et.creation_ctx->get_connection_cl()->name),
-    scs);
-
+  store_field_value_to_buff(event_table->field[ET_FIELD_COLLATION_CONNECTION],
+                            tmp_string);
+  sch_table->field[ISE_CONNECTION_CL]->store(tmp_string->ptr(),
+                                             tmp_string->length(), scs);
   sch_table->field[ISE_DB_CL]->set_notnull();
-  sch_table->field[ISE_DB_CL]->store(
-    et.creation_ctx->get_db_cl()->name,
-    strlen(et.creation_ctx->get_db_cl()->name),
-    scs);
+  store_field_value_to_buff(event_table->field[ET_FIELD_DB_COLLATION],
+                            tmp_string);
+  sch_table->field[ISE_DB_CL]->store(tmp_string->ptr(),
+                                     tmp_string->length(), scs);
 
   if (schema_table_store_record(thd, sch_table))
-    DBUG_RETURN(1);
+    DBUG_RETURN(TRUE);
 
-  DBUG_RETURN(0);
+  DBUG_RETURN(FALSE);
 }
 #endif
 

=== modified file 'sql/sql_show.h'
--- a/sql/sql_show.h	2009-10-12 09:08:34 +0000
+++ b/sql/sql_show.h	2010-03-12 14:58:40 +0000
@@ -38,6 +38,7 @@ bool store_db_create_info(THD *thd, cons
                           HA_CREATE_INFO *create_info, const char *orig_dbname);
 int view_store_create_info(THD *thd, TABLE_LIST *table, String *buff);
 
-int copy_event_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table);
+int copy_event_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table,
+                               String *tmp_string);
 
 #endif /* SQL_SHOW_H */


Attachment: [text/bzr-bundle] bzr/sergey.glukhov@sun.com-20100312145840-mn65bmps6xuoeyiv.bundle
Thread
bzr commit into mysql-pe branch (Sergey.Glukhov:3968) Bug#48729Sergey Glukhov12 Mar 2010
  • Re: bzr commit into mysql-pe branch (Sergey.Glukhov:3968) Bug#48729Sergey Vojtovich23 Mar 2010