List:Commits« Previous MessageNext Message »
From:ahristov Date:August 18 2006 11:54am
Subject:bk commit into 5.1 tree (andrey:1.2281)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of andrey. When andrey 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-08-18 13:54:47+02:00, andrey@stripped +5 -0
  WL#3337 (Event scheduler new architecture)
  
  Fix checking of length of `name` - code and utf8 tests added.

  mysql-test/r/events_utf8.result@stripped, 2006-08-18 13:54:37+02:00, andrey@stripped +38 -0
    New BitKeeper file ``mysql-test/r/events_utf8.result''

  mysql-test/r/events_utf8.result@stripped, 2006-08-18 13:54:37+02:00, andrey@stripped +0 -0

  sql/event_db_repository.cc@stripped, 2006-08-18 13:54:36+02:00, andrey@stripped +64 -46
    - Obey to function's documentation : make check_parse_data return bool
    - Extract checking whether the length of `name` part is too long to a
      separate method and call it from wherever needed.

  sql/event_db_repository.h@stripped, 2006-08-18 13:54:36+02:00, andrey@stripped +3 -0
    - A private method to isolate in one place the checking of the length
      of `name` identifier part.

  sql/share/errmsg.txt@stripped, 2006-08-18 13:54:37+02:00, andrey@stripped +28 -28
    The names could be up to 64 chars, which makes up to 192 bytes.
    Extend the shown data.

  sql/sql_parse.cc@stripped, 2006-08-18 13:54:37+02:00, andrey@stripped +11 -14
    - More asserts
    - Add more documentation, for the senile persons like me :)
    - Remove the check for the length of the name, it's moved to
      Event_db_repository.

# 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:	andrey
# Host:	example.com
# Root:	/work/mysql-5.1-wl3337

--- 1.571/sql/sql_parse.cc	2006-08-18 13:54:56 +02:00
+++ 1.572/sql/sql_parse.cc	2006-08-18 13:54:57 +02:00
@@ -3899,6 +3899,8 @@ end_with_restore_list:
   {
     uint affected= 1;
     DBUG_ASSERT(lex->event_parse_data);
+    DBUG_ASSERT(!lex->spname || (lex->spname->m_db.str &&
+                                 lex->spname->m_name.str));
     switch (lex->sql_command) {
     case SQLCOM_CREATE_EVENT:
       res= Events::get_instance()->
@@ -3911,12 +3913,18 @@ end_with_restore_list:
              update_event(thd, lex->event_parse_data, lex->spname, &affected);
       break;
     default:;
+      DBUG_ASSERT(0);
     }
     DBUG_PRINT("info",("DDL error code=%d affected=%d", res, affected));
     if (!res)
       send_ok(thd, affected);
 
-    /* Don't do it, if we are inside a SP */
+    /*
+      Don't do it, if we are inside a SP. We delete the sp_head object we
+      created ourselves. Because only during CREATE EVENT and in some cases in
+      ALTER EVENT such a object is create, therefore this block is only here and
+      not suitable for DROP_EVENT.
+     */
     if (!thd->spcont)
     {
       delete lex->sphead;
@@ -3929,29 +3937,18 @@ end_with_restore_list:
   case SQLCOM_DROP_EVENT:
   case SQLCOM_SHOW_CREATE_EVENT:
   {
-    DBUG_ASSERT(lex->spname);
-    if (! lex->spname->m_db.str)
-    {
-      my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
-      goto error;
-    }
+    DBUG_ASSERT(lex->spname && lex->spname->m_db.str && lex->spname->m_name.str);
     if (check_access(thd, EVENT_ACL, lex->spname->m_db.str, 0, 0, 0,
                      is_schema_db(lex->spname->m_db.str)))
       break;
 
-    if (lex->spname->m_name.length > NAME_LEN)
-    {
-      my_error(ER_TOO_LONG_IDENT, MYF(0), lex->spname->m_name.str);
-      /* this jumps to the end of the function and skips own messaging */
-      goto error;
-    }
-
     if (lex->sql_command == SQLCOM_SHOW_CREATE_EVENT)
       res= Events::get_instance()->show_create_event(thd, lex->spname->m_db,
                                                      lex->spname->m_name);
     else
     {
       uint affected= 1;
+      DBUG_ASSERT(lex->sql_command == SQLCOM_DROP_EVENT);
       if (!(res= Events::get_instance()->drop_event(thd,
                                                     lex->spname->m_db,
                                                     lex->spname->m_name,
--- New file ---
+++ mysql-test/r/events_utf8.result	06/08/18 13:54:37
create database if not exists events_test;
use events_test;
set names utf8;
"Let's test whether the upper limit is 64bytes or chars"
create event `ИмеНаСъбитиеКоетоТрябваДаЕ64Байта1234` on schedule every 1 year do select row_count();
show create event `ИмеНаСъбитиеКоетоТрябваДаЕ64Байта1234`;
Event	sql_mode	Create Event
ИмеНаСъбитиеКоетоТрябваДаЕ64Байта1234		CREATE EVENT `ИмеНаСъбитиеКоетоТрябваДаЕ64Байта1234` ON SCHEDULE EVERY 1 YEAR ON COMPLETION NOT PRESERVE ENABLE DO select row_count()
create event `ИмеНаСъбитиеКоетоТрябваДаЕ65Байта12345` on schedule every 1 year do select row_count();
show create event `ИмеНаСъбитиеКоетоТрябваДаЕ65Байта12345`;
Event	sql_mode	Create Event
ИмеНаСъбитиеКоетоТрябваДаЕ65Байта12345		CREATE EVENT `ИмеНаСъбитиеКоетоТрябваДаЕ65Байта12345` ON SCHEDULE EVERY 1 YEAR ON COMPLETION NOT PRESERVE ENABLE DO select row_count()
create event `ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБа` on schedule every 1 year do select row_count();
show create event `ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБа`;
Event	sql_mode	Create Event
ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБа		CREATE EVENT `ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБа` ON SCHEDULE EVERY 1 YEAR ON COMPLETION NOT PRESERVE ENABLE DO select row_count()
create event `ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБа1` on schedule every 1 year do select row_count();
ERROR 42000: Identifier name 'ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБа1' is too long
show create event `ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБа1`;
ERROR 42000: Identifier name 'ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБа1' is too long
create event `ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБ12` on schedule every 1 year do select row_count();
ERROR 42000: Identifier name 'ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБ12' is too long
show create event `ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБ12`;
ERROR 42000: Identifier name 'ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБ12' is too long
create event ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБай on schedule every 1 year do select row_count();
ERROR 42000: Identifier name 'ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБай' is too long
show create event ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБай;
ERROR 42000: Identifier name 'ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБай' is too long
drop event `ИмеНаСъбитиеКоетоТрябваДаЕ64Байта1234`;
drop event `ИмеНаСъбитиеКоетоТрябваДаЕ65Байта12345`;
drop event `ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБа`;
drop event `ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБа1`;
ERROR 42000: Identifier name 'ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБа1' is too long
drop event ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБ12;
ERROR 42000: Identifier name 'ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБ12' is too long
drop event ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБай;
ERROR 42000: Identifier name 'ИмеНаСъбитиеКоетоТрябваДаЕБайтаИмеНаСъбитиеКоетоТрябваДаЕБайтаБай' is too long
drop database events_test;


--- 1.14/sql/event_db_repository.cc	2006-08-18 13:54:57 +02:00
+++ 1.15/sql/event_db_repository.cc	2006-08-18 13:54:57 +02:00
@@ -466,7 +466,7 @@ Event_db_repository::open_event_table(TH
     TRUE   Error (reported)
 */
 
-static int
+static bool
 check_parse_params(THD *thd, Event_parse_data *parse_data)
 {
   const char *pos= NULL;
@@ -476,24 +476,16 @@ check_parse_params(THD *thd, Event_parse
   DBUG_ENTER("check_parse_params");
 
   if (parse_data->check_parse_data(thd))
-    DBUG_RETURN(EVEX_BAD_PARAMS);
-
-  if (!parse_data->dbname.str ||
-      (thd->lex->sql_command == SQLCOM_ALTER_EVENT && thd->lex->spname &&
-       !thd->lex->spname->m_db.str))
-  {
-    my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
-    DBUG_RETURN(EVEX_BAD_PARAMS);
-  }
+    DBUG_RETURN(TRUE);
 
   if (check_access(thd, EVENT_ACL, parse_data->dbname.str, 0, 0, 0,
                    is_schema_db(parse_data->dbname.str)) ||
       (thd->lex->sql_command == SQLCOM_ALTER_EVENT && thd->lex->spname &&
        (check_access(thd, EVENT_ACL, thd->lex->spname->m_db.str, 0, 0, 0,
                      is_schema_db(thd->lex->spname->m_db.str)))))
-    DBUG_RETURN(EVEX_BAD_PARAMS);
+    DBUG_RETURN(TRUE);
 
-  DBUG_RETURN(0);
+  DBUG_RETURN(FALSE);
 }
 
 
@@ -540,9 +532,24 @@ Event_db_repository::create_event(THD *t
     goto err;
   }
 
+  /* is_event_name_too_long() emits an error */
+  if (is_event_name_too_long(table, parse_data->name)) 
+    goto err;
 
-  DBUG_PRINT("info", ("name: %.*s", parse_data->name.length,
-             parse_data->name.str));
+  /* dbname has been checked already in the parser by check_db_name() */
+
+  if (parse_data->body.length > table->field[ET_FIELD_BODY]->field_length)
+  {
+    my_error(ER_TOO_LONG_BODY, MYF(0), parse_data->name.str);
+    goto err;
+  }
+
+  if (!(parse_data->expression) && !(parse_data->execute_at.year))
+  {
+    DBUG_PRINT("error", ("neither expression nor execute_at are set!"));
+    my_error(ER_EVENT_NEITHER_M_EXPR_NOR_M_AT, MYF(0));
+    goto err;
+  }
 
   DBUG_PRINT("info", ("check existance of an event with the same name"));
   if (!find_named_event(thd, parse_data->dbname, parse_data->name, table))
@@ -568,37 +575,6 @@ Event_db_repository::create_event(THD *t
 
   restore_record(table, s->default_values);     // Get default values for fields
 
-  if (system_charset_info->cset->
-        numchars(system_charset_info, parse_data->dbname.str,
-                 parse_data->dbname.str + parse_data->dbname.length) >
-      table->field[ET_FIELD_DB]->char_length())
-  {
-    my_error(ER_TOO_LONG_IDENT, MYF(0), parse_data->dbname.str);
-    goto err;
-  }
-
-  if (system_charset_info->cset->
-        numchars(system_charset_info, parse_data->name.str,
-                 parse_data->name.str + parse_data->name.length) >
-      table->field[ET_FIELD_NAME]->char_length())
-  {
-    my_error(ER_TOO_LONG_IDENT, MYF(0), parse_data->name.str);
-    goto err;
-  }
-
-  if (parse_data->body.length > table->field[ET_FIELD_BODY]->field_length)
-  {
-    my_error(ER_TOO_LONG_BODY, MYF(0), parse_data->name.str);
-    goto err;
-  }
-
-  if (!(parse_data->expression) && !(parse_data->execute_at.year))
-  {
-    DBUG_PRINT("error", ("neither expression nor execute_at are set!"));
-    my_error(ER_EVENT_NEITHER_M_EXPR_NOR_M_AT, MYF(0));
-    goto err;
-  }
-
   ((Field_timestamp *)table->field[ET_FIELD_CREATED])->set_time();
 
   /*
@@ -664,15 +640,21 @@ Event_db_repository::update_event(THD *t
   TABLE *table= NULL;
   DBUG_ENTER("Event_db_repository::update_event");
 
+  if (check_parse_params(thd, parse_data))
+    goto err;
+
   if (open_event_table(thd, TL_WRITE, &table))
   {
     my_error(ER_EVENT_OPEN_TABLE_FAILED, MYF(0));
     goto err;
   }
 
-  if (check_parse_params(thd, parse_data))
+  /* is_event_name_too_long() emits an error */
+  if (is_event_name_too_long(table, parse_data->name)) 
     goto err;
 
+  /* dbname has been checked already in the parser by check_db_name() */
+
   DBUG_PRINT("info", ("dbname: %s", parse_data->dbname.str));
   DBUG_PRINT("info", ("name: %s", parse_data->name.str));
   DBUG_PRINT("info", ("user: %s", parse_data->definer.str));
@@ -782,6 +764,12 @@ Event_db_repository::drop_event(THD *thd
     goto done;
   }
 
+  /* is_event_name_too_long() emits an error */
+  if ((ret= is_event_name_too_long(table, name)))
+    goto done;
+
+  /* dbname has been checked already in the parser by check_db_name() */
+
   if (!(ret= find_named_event(thd, db, name, table)))
   {
     /* Close active transaction only if we are actually going to modify disk */
@@ -969,6 +957,8 @@ Event_db_repository::load_named_event(TH
 
   if ((ret= open_event_table(thd, TL_READ, &table)))
     my_error(ER_EVENT_OPEN_TABLE_FAILED, MYF(0));
+  else if ((ret= is_event_name_too_long(table, name)))
+    /* is_event_name_too_long() emits an error */;
   else if ((ret= find_named_event(thd, dbname, name, table)))
     my_error(ER_EVENT_DOES_NOT_EXIST, MYF(0), name.str);
   else if ((ret= etn->load_from_row(table)))
@@ -980,5 +970,33 @@ Event_db_repository::load_named_event(TH
   thd->restore_backup_open_tables_state(&backup);
   /* In this case no memory was allocated so we don't need to clean */
 
+  DBUG_RETURN(ret);
+}
+
+
+/*
+  Checks whether the event name is too long and emits an error.
+
+  SYNOPSIS
+    Event_db_repository::is_event_name_too_long()
+      table   [in]  mysql.event handle
+      name    [in]  Event's name
+
+  RETURN VALUE
+    FALSE  OK
+    TRUE   Too long
+*/
+
+bool
+Event_db_repository::is_event_name_too_long(TABLE *table, LEX_STRING name)
+{
+  bool ret;
+  DBUG_ENTER("Event_db_repository::is_event_name_too_long");
+  DBUG_PRINT("enter", ("name: %.*s", name.length, name.str));
+
+  if ((ret= (system_charset_info->cset->numchars(system_charset_info, name.str,
+                                          name.str + name.length) >
+      table->field[ET_FIELD_NAME]->char_length())))
+    my_error(ER_TOO_LONG_IDENT, MYF(0), name.str);
   DBUG_RETURN(ret);
 }

--- 1.9/sql/event_db_repository.h	2006-08-18 13:54:57 +02:00
+++ 1.10/sql/event_db_repository.h	2006-08-18 13:54:57 +02:00
@@ -96,6 +96,9 @@ private:
   static bool
   check_system_tables(THD *thd);
 
+  bool
+  is_event_name_too_long(TABLE *table, LEX_STRING name);
+
   /* Prevent use of these */
   Event_db_repository(const Event_db_repository &);
   void operator=(Event_db_repository &);

--- 1.119/sql/share/errmsg.txt	2006-08-18 13:54:57 +02:00
+++ 1.120/sql/share/errmsg.txt	2006-08-18 13:54:57 +02:00
@@ -1404,30 +1404,30 @@ ER_WRONG_VALUE_COUNT 21S01 
 ER_TOO_LONG_IDENT 42000 S1009
-	dan "Navnet '%-.64s' er for langt"
-	nla "Naam voor herkenning '%-.64s' is te lang"
-	eng "Identifier name '%-.100s' is too long"
-	est "Identifikaatori '%-.100s' nimi on liiga pikk"
-	fre "Le nom de l'identificateur '%-.64s' est trop long"
-	ger "Name des Bezeichners '%-.100s' ist zu lang"
-	hun "A(z) '%-.100s' azonositonev tul hosszu."
-	ita "Il nome dell'identificatore '%-.100s' e` troppo lungo"
-	nor "Identifikator '%-.64s' er for lang"
-	norwegian-ny "Identifikator '%-.64s' er for lang"
-	rum "Numele indentificatorului '%-.100s' este prea lung"
-	spa "El nombre del identificador '%-.64s' es demasiado grande"
+	dan "Navnet '%-.192s' er for langt"
+	nla "Naam voor herkenning '%-.192s' is te lang"
+	eng "Identifier name '%-.192s' is too long"
+	est "Identifikaatori '%-.192s' nimi on liiga pikk"
+	fre "Le nom de l'identificateur '%-.192s' est trop long"
+	ger "Name des Bezeichners '%-.192s' ist zu lang"
+	hun "A(z) '%-.192s' azonositonev tul hosszu."
+	ita "Il nome dell'identificatore '%-.192s' e` troppo lungo"
+	nor "Identifikator '%-.192s' er for lang"
+	norwegian-ny "Identifikator '%-.192s' er for lang"
+	rum "Numele indentificatorului '%-.192s' este prea lung"
+	spa "El nombre del identificador '%-.192s' es demasiado grande"
 ER_DUP_FIELDNAME 42S21 S1009
 	dan "Feltnavnet '%-.64s' findes allerede"
@@ -5758,13 +5758,13 @@ ER_BINLOG_ROW_WRONG_TABLE_DEF
 ER_BINLOG_ROW_RBR_TO_SBR
 	eng "Slave running with --log-slave-updates must use row-based binary logging to be able to replicate row-based binary log events"
 ER_EVENT_ALREADY_EXISTS
-        eng "Event '%-.64s' already exists"
+        eng "Event '%-.192s' already exists"
 ER_EVENT_STORE_FAILED
-        eng "Failed to store event %s. Error code %d from storage engine."
+        eng "Failed to store event %-.192s. Error code %d from storage engine."
 ER_EVENT_DOES_NOT_EXIST
-        eng "Unknown event '%-.64s'"
+        eng "Unknown event '%-.192s'"
 ER_EVENT_CANT_ALTER
-        eng "Failed to alter event '%-.64s'"
+        eng "Failed to alter event '%-.192s'"
 ER_EVENT_DROP_FAILED
         eng "Failed to drop %s"
 ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG
Thread
bk commit into 5.1 tree (andrey:1.2281)ahristov18 Aug