MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:antony Date:January 26 2008 12:05am
Subject:bk commit into 5.1 tree (acurtis:1.2659) BUG#33358
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of acurtis.  When acurtis 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, 2008-01-25 16:05:15-08:00, acurtis@stripped +4 -0
  Bug#33358
    "Plugin enum variables can't be set from command line"
    fix crash of LOCK_plugins mutex when loading plug-ins from command line.
    fix off-by-one bug when loading multiple plug-ins from the command line.
    initialize command line handling for ENUM and SET plugin variable types.

  mysql-test/r/plugin_load.result@stripped, 2008-01-25 16:04:59-08:00, acurtis@stripped +3 -0
    New BitKeeper file ``mysql-test/r/plugin_load.result''

  mysql-test/r/plugin_load.result@stripped, 2008-01-25 16:04:59-08:00, acurtis@stripped +0 -0

  mysql-test/t/plugin_load-master.opt@stripped, 2008-01-25 16:04:59-08:00, acurtis@stripped +3 -0
    New BitKeeper file ``mysql-test/t/plugin_load-master.opt''

  mysql-test/t/plugin_load-master.opt@stripped, 2008-01-25 16:04:59-08:00, acurtis@stripped +0 -0

  mysql-test/t/plugin_load.test@stripped, 2008-01-25 16:04:59-08:00, acurtis@stripped +3 -0
    New BitKeeper file ``mysql-test/t/plugin_load.test''

  mysql-test/t/plugin_load.test@stripped, 2008-01-25 16:04:59-08:00, acurtis@stripped +0 -0

  sql/sql_plugin.cc@stripped, 2008-01-25 16:04:59-08:00, acurtis@stripped +48 -18
    Bug33358
      fix crash of LOCK_plugins mutex when loading plug-ins from command line.
      fix off-by-one bug when loading multiple plug-ins from the command line.
      initialize command line handling for ENUM and SET plugin variable types.

diff -Nrup a/mysql-test/r/plugin_load.result b/mysql-test/r/plugin_load.result
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/r/plugin_load.result	2008-01-25 16:04:59 -08:00
@@ -0,0 +1,3 @@
+SELECT @@global.example_enum_var = 'e2';
+@@global.example_enum_var = 'e2'
+1
diff -Nrup a/mysql-test/t/plugin_load-master.opt b/mysql-test/t/plugin_load-master.opt
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/t/plugin_load-master.opt	2008-01-25 16:04:59 -08:00
@@ -0,0 +1,3 @@
+$EXAMPLE_PLUGIN_OPT
+"--plugin-load=;EXAMPLE=ha_example.so;"
+--plugin-example-enum-var=e2
diff -Nrup a/mysql-test/t/plugin_load.test b/mysql-test/t/plugin_load.test
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/t/plugin_load.test	2008-01-25 16:04:59 -08:00
@@ -0,0 +1,3 @@
+--source include/have_example_plugin.inc
+
+SELECT @@global.example_enum_var = 'e2';
diff -Nrup a/sql/sql_plugin.cc b/sql/sql_plugin.cc
--- a/sql/sql_plugin.cc	2007-12-13 03:49:55 -08:00
+++ b/sql/sql_plugin.cc	2008-01-25 16:04:59 -08:00
@@ -1412,7 +1412,11 @@ static bool plugin_load_list(MEM_ROOT *t
   while (list)
   {
     if (p == buffer + sizeof(buffer) - 1)
-      break;
+    {
+      sql_print_error("plugin-load parameter too long");
+      DBUG_RETURN(TRUE);
+    }
+
     switch ((*(p++)= *(list++))) {
     case '\0':
       list= NULL; /* terminate the loop */
@@ -1421,10 +1425,17 @@ static bool plugin_load_list(MEM_ROOT *t
     case ':':     /* can't use this as delimiter as it may be drive letter */
 #endif
     case ';':
-      name.str[name.length]= '\0';
-      if (str != &dl)  // load all plugins in named module
+      str->str[str->length]= '\0';
+      if (str == &name)  // load all plugins in named module
       {
+        if (!name.length)
+        {
+          p--;    /* reset pointer */
+          continue;
+        }
+
         dl= name;
+        pthread_mutex_lock(&LOCK_plugin);
         if ((plugin_dl= plugin_dl_add(&dl, REPORT_TO_LOG)))
         {
           for (plugin= plugin_dl->plugins; plugin->info; plugin++)
@@ -1434,7 +1445,10 @@ static bool plugin_load_list(MEM_ROOT *t
 
             free_root(tmp_root, MYF(MY_MARK_BLOCKS_FREE));
             if (plugin_add(tmp_root, &name, &dl, argc, argv, REPORT_TO_LOG))
+            {
+              pthread_mutex_unlock(&LOCK_plugin);
               goto error;
+            }
           }
           plugin_dl_del(&dl); // reduce ref count
         }
@@ -1442,9 +1456,14 @@ static bool plugin_load_list(MEM_ROOT *t
       else
       {
         free_root(tmp_root, MYF(MY_MARK_BLOCKS_FREE));
+        pthread_mutex_lock(&LOCK_plugin);
         if (plugin_add(tmp_root, &name, &dl, argc, argv, REPORT_TO_LOG))
+        {
+          pthread_mutex_unlock(&LOCK_plugin);
           goto error;
+        }
       }
+      pthread_mutex_unlock(&LOCK_plugin);
       name.length= dl.length= 0;
       dl.str= NULL; name.str= p= buffer;
       str= &name;
@@ -1453,6 +1472,7 @@ static bool plugin_load_list(MEM_ROOT *t
     case '#':
       if (str == &name)
       {
+        name.str[name.length]= '\0';
         str= &dl;
         str->str= p;
         continue;
@@ -2999,7 +3019,8 @@ static int construct_options(MEM_ROOT *m
       DBUG_RETURN(-1);
     }
 
-    if (opt->flags & PLUGIN_VAR_NOCMDOPT)
+    if ((opt->flags & (PLUGIN_VAR_NOCMDOPT | PLUGIN_VAR_THDLOCAL))
+                    == PLUGIN_VAR_NOCMDOPT)
       continue;
 
     if (!opt->name)
@@ -3009,7 +3030,7 @@ static int construct_options(MEM_ROOT *m
       DBUG_RETURN(-1);
     }
 
-    if (!(v= find_bookmark(name, opt->name, opt->flags)))
+    if (!(opt->flags & PLUGIN_VAR_THDLOCAL))
     {
       optnamelen= strlen(opt->name);
       optname= (char*) alloc_root(mem_root, namelen + optnamelen + 2);
@@ -3017,7 +3038,23 @@ static int construct_options(MEM_ROOT *m
       optnamelen= namelen + optnamelen + 1;
     }
     else
-      optname= (char*) memdup_root(mem_root, v->key + 1, (optnamelen= v->name_len) + 1);
+    {
+      /* this should not fail because register_var should create entry */
+      if (!(v= find_bookmark(name, opt->name, opt->flags)))
+      {
+        sql_print_error("Thread local variable '%s' not allocated "
+                        "in plugin '%s'.", opt->name, plugin_name);
+        DBUG_RETURN(-1);
+      }
+
+      *(int*)(opt + 1)= offset= v->offset;
+
+      if (opt->flags & PLUGIN_VAR_NOCMDOPT)
+        continue;
+
+      optname= (char*) memdup_root(mem_root, v->key + 1, 
+                                   (optnamelen= v->name_len) + 1);
+    }
 
     /* convert '_' to '-' */
     for (p= optname; *p; p++)
@@ -3029,20 +3066,13 @@ static int construct_options(MEM_ROOT *m
     options->app_type= opt;
     options->id= (options-1)->id + 1;
 
-    if (opt->flags & PLUGIN_VAR_THDLOCAL)
-      *(int*)(opt + 1)= offset= v->offset;
-
     plugin_opt_set_limits(options, opt);
 
-    if ((opt->flags & PLUGIN_VAR_TYPEMASK) != PLUGIN_VAR_ENUM &&
-        (opt->flags & PLUGIN_VAR_TYPEMASK) != PLUGIN_VAR_SET)
-    {
-      if (opt->flags & PLUGIN_VAR_THDLOCAL)
-        options->value= options->u_max_value= (uchar**)
-          (global_system_variables.dynamic_variables_ptr + offset);
-      else
-        options->value= options->u_max_value= *(uchar***) (opt + 1);
-    }
+    if (opt->flags & PLUGIN_VAR_THDLOCAL)
+      options->value= options->u_max_value= (uchar**)
+        (global_system_variables.dynamic_variables_ptr + offset);
+    else
+      options->value= options->u_max_value= *(uchar***) (opt + 1);
 
     options[1]= options[0];
     options[1].name= p= (char*) alloc_root(mem_root, optnamelen + 8);
Thread
bk commit into 5.1 tree (acurtis:1.2659) BUG#33358antony26 Jan