List:Commits« Previous MessageNext Message »
From:Tatiana A. Nurnberg Date:October 21 2009 7:28am
Subject:bzr commit into mysql-5.4 branch (azundris:2854) Bug#46586
View as plain text  
#At file:///Users/tnurnberg/forest/54-46586-wl4939/ based on revid:horst@stripped

 2854 Tatiana A. Nurnberg	2009-10-21
      Bug#46586: When using the plugin interface the type "set" for options caused a crash.
      
      "What do you mean, there's a bug? There isn't even code!"
      
      There was some token code for plug-in variables of the SET type,
      but clearly this never worked, or was subject to massive bit rot
      since. Bug-fixes ... fail-safes ... tests -- fais au mieux, mon chou!
     @ mysql-test/suite/test-plugin/r/tse_sysvar.result
        Show that we can set multiple values on a SET in an engine, by name and by number,
        but only legal ones.
     @ mysql-test/suite/test-plugin/t/tse_sysvar.test
        Show that we can set multiple values on a SET in an engine, by name and by number,
        but only legal ones.
     @ mysys/my_getopt.c
        SETs set-up should set up a default value, but no min/max bounding.
     @ mysys/typelib.c
        fail-safe requested by serg: don't try to skip separator when we're
        already at end of string.
     @ sql/sql_plugin.cc
        check_func_set:
        Initialize error_len as find_set() will only update it on error,
        and we're using the value to see whether an error has occurred (!= 0),
        so we'd better not have a random val in there.
        
        value_ptr:
        There's no guarantee we're handed string lengths, so play it safe!
        Use prepared string lengths where possible for minimum speed gain,
        otherwise determine on the fly!
     @ storage/tse/tse_system_variables.h
        switch sysvar options to bit-wise or.
        
        re-activate demo-variable for SET in test storage engine (TSE).

    modified:
      mysql-test/suite/test-plugin/r/tse_sysvar.result
      mysql-test/suite/test-plugin/t/tse_sysvar.test
      mysys/my_getopt.c
      mysys/typelib.c
      sql/sql_plugin.cc
      storage/tse/tse_system_variables.h
=== modified file 'mysql-test/suite/test-plugin/r/tse_sysvar.result'
--- a/mysql-test/suite/test-plugin/r/tse_sysvar.result	2009-08-11 10:33:26 +0000
+++ b/mysql-test/suite/test-plugin/r/tse_sysvar.result	2009-10-21 07:28:04 +0000
@@ -6,12 +6,14 @@ SHOW VARIABLES LIKE 'tse%';
 Variable_name	Value
 tse_vbool	ON
 tse_venum	e1
+tse_vinject	nothing
 tse_vint	8
 tse_vintunlimit	0
 tse_vlong	1
 tse_vlonglong	1
 tse_vlonglongunlimit	0
 tse_vlongunlimit	0
+tse_vset	s1
 tse_vstr	default is read only
 tse_vstrmalloc	default
 tse_vuint	8
@@ -570,4 +572,21 @@ SHOW VARIABLES LIKE 'tse_vulonglong';
 Variable_name	Value
 tse_vulonglong	18446744073709550616
 ####### Set ######################
+SHOW VARIABLES LIKE 'tse_vset';
+Variable_name	Value
+tse_vset	s1
+SET @@global.tse_vset= 3;
+SHOW VARIABLES LIKE 'tse_vset';
+Variable_name	Value
+tse_vset	s1,s2
+SET @@global.tse_vset= 9999;
+ERROR 42000: Variable 'vset' can't be set to the value of '9999'
+SET @@global.tse_vset= 's1,s4';
+SHOW VARIABLES LIKE 'tse_vset';
+Variable_name	Value
+tse_vset	s1,s4
+SET @@global.tse_vset= DEFAULT;
+SHOW VARIABLES LIKE 'tse_vset';
+Variable_name	Value
+tse_vset	s1
 UNINSTALL PLUGIN tse;

=== modified file 'mysql-test/suite/test-plugin/t/tse_sysvar.test'
--- a/mysql-test/suite/test-plugin/t/tse_sysvar.test	2009-08-11 10:33:26 +0000
+++ b/mysql-test/suite/test-plugin/t/tse_sysvar.test	2009-10-21 07:28:04 +0000
@@ -378,14 +378,24 @@ SHOW VARIABLES LIKE 'tse_venum';
 SET @@global.tse_venum= 5;
 SHOW VARIABLES LIKE 'tse_venum';
 
---error ER_WRONG_TYPE_FOR_VAR 
+--error ER_WRONG_TYPE_FOR_VAR
 SET @@global.tse_vulonglong= "TRUE";
 SHOW VARIABLES LIKE 'tse_vulonglong';
 
 --echo ####### Set ######################
-#SHOW VARIABLES LIKE 'tse_vset';
-#SET @@global.tse_vset= 1;
-#SHOW VARIABLES LIKE 'tse_vset';
+SHOW VARIABLES LIKE 'tse_vset';
+
+SET @@global.tse_vset= 3;
+SHOW VARIABLES LIKE 'tse_vset';
+
+--error ER_WRONG_VALUE_FOR_VAR
+SET @@global.tse_vset= 9999;
+
+SET @@global.tse_vset= 's1,s4';
+SHOW VARIABLES LIKE 'tse_vset';
+
+SET @@global.tse_vset= DEFAULT;
+SHOW VARIABLES LIKE 'tse_vset';
 
 UNINSTALL PLUGIN tse;
 

=== modified file 'mysys/my_getopt.c'
--- a/mysys/my_getopt.c	2009-06-25 14:09:38 +0000
+++ b/mysys/my_getopt.c	2009-10-21 07:28:04 +0000
@@ -1030,10 +1030,12 @@ static void init_one_value(const struct 
   case GET_LL:
     *((longlong*) variable)= (longlong) getopt_ll_limit_value((longlong) value, option, NULL);
     break;
-  case GET_ULL: /* Fall through */
-  case GET_SET:
+  case GET_ULL:
     *((ulonglong*) variable)= (ulonglong) getopt_ull_limit_value((ulonglong) value, option, NULL);
     break;
+  case GET_SET:
+    *((ulonglong*) variable)= (ulonglong) value;
+    break;
   case GET_DOUBLE:
     *((double*) variable)=  (double) value;
     break;

=== modified file 'mysys/typelib.c'
--- a/mysys/typelib.c	2009-05-14 21:49:53 +0000
+++ b/mysys/typelib.c	2009-10-21 07:28:04 +0000
@@ -182,7 +182,10 @@ my_ulonglong find_typeset(char *x, TYPEL
   {
     (*err)++;
     i= x;
-    while (*x && *x != field_separator) x++;
+    while (*x && *x != field_separator)
+      x++;
+    if (x[0] && x[1])                            // skip separator if found
+      x++;
     if ((find= find_type(i, lib, 2 | 8) - 1) < 0)
       DBUG_RETURN(0);
     result|= (1ULL << find);

=== modified file 'sql/sql_plugin.cc'
--- a/sql/sql_plugin.cc	2009-07-06 12:06:20 +0000
+++ b/sql/sql_plugin.cc	2009-10-21 07:28:04 +0000
@@ -2099,7 +2099,7 @@ static int check_func_set(THD *thd, stru
   const char *strvalue= "NULL", *str;
   TYPELIB *typelib;
   ulonglong result;
-  uint error_len;
+  uint error_len= 0;                            // init as only set on error
   bool not_used;
   int length;
 
@@ -2694,7 +2694,9 @@ uchar* sys_var_pluginvar::value_ptr(THD 
     {
       if (!(value & mask))
         continue;
-      str.append(typelib->type_names[i], typelib->type_lengths[i]);
+      str.append(typelib->type_names[i], typelib->type_lengths
+                                       ? typelib->type_lengths[i]
+                                       : strlen(typelib->type_names[i]));
       str.append(',');
     }
 

=== modified file 'storage/tse/tse_system_variables.h'
--- a/storage/tse/tse_system_variables.h	2009-09-07 10:45:11 +0000
+++ b/storage/tse/tse_system_variables.h	2009-10-21 07:28:04 +0000
@@ -52,7 +52,7 @@ static unsigned int tse_uint_var= 0;
 static MYSQL_SYSVAR_UINT(
   vuint,                    // commandline name
   tse_uint_var,             // internal variable
-  PLUGIN_VAR_UNSIGNED ||
+  PLUGIN_VAR_UNSIGNED |
   PLUGIN_VAR_INT,           // type of variable = requests an argument
   "TSE uint with 0..1000",  // Comment
   NULL,
@@ -70,7 +70,7 @@ static unsigned int tse_uintunlimit_var=
 static MYSQL_SYSVAR_UINT(
   vuintunlimit,             // commandline name
   tse_uintunlimit_var,      // internal variable
-  PLUGIN_VAR_UNSIGNED ||
+  PLUGIN_VAR_UNSIGNED |
   PLUGIN_VAR_INT,           // type of variable = requests an argument
   "TSE uint",               // Comment
   NULL,
@@ -119,7 +119,7 @@ static unsigned long tse_ulong_var= 0;
 static MYSQL_SYSVAR_ULONG(
   vulong,                   // commandline name
   tse_ulong_var,            // internal variable
-  PLUGIN_VAR_UNSIGNED ||
+  PLUGIN_VAR_UNSIGNED |
   PLUGIN_VAR_LONG,          // type of variable = requests an argument
   "TSE ulong with 0..1000", // Comment
   NULL,
@@ -136,7 +136,7 @@ static unsigned long tse_ulongunlimit_va
 static MYSQL_SYSVAR_ULONG(
   vulongunlimit,            // commandline name
   tse_ulongunlimit_var,     // internal variable
-  PLUGIN_VAR_UNSIGNED ||
+  PLUGIN_VAR_UNSIGNED |
   PLUGIN_VAR_LONG,          // type of variable = requests an argument
   "TSE ulong",              // Comment
   NULL,
@@ -217,7 +217,7 @@ static unsigned long long tse_ulonglong_
 static MYSQL_SYSVAR_ULONGLONG(
   vulonglong,               // commandline name
   tse_ulonglong_var,        // internal variable
-  PLUGIN_VAR_UNSIGNED ||
+  PLUGIN_VAR_UNSIGNED |
   PLUGIN_VAR_LONGLONG,      // type of variable = requests an argument
   "TSE ulonglong with -1000..1000", // Comment
   NULL,
@@ -234,7 +234,7 @@ static unsigned long long tse_ulonglongu
 static MYSQL_SYSVAR_ULONGLONG(
   vulonglongunlimit,        // commandline name
   tse_ulonglongunlimit_var, // internal variable
-  PLUGIN_VAR_UNSIGNED ||
+  PLUGIN_VAR_UNSIGNED |
   PLUGIN_VAR_LONGLONG,      // type of variable = requests an argument
   "TSE ulonglong",          // Comment
   NULL,
@@ -295,24 +295,22 @@ static MYSQL_SYSVAR_ENUM(
   0,                        // default value
   &enum_var_typelib);       // Typelib
 
-//static unsigned long long tse_set_var= 0;
+static unsigned long long tse_set_var= 0;
 
-/*static const char *set_var_names[]=
+static const char *set_var_names[]=
 {
   "s1", "s2", "s3", "s4", NullS
 };
-*/
-//static unsigned int set_length= 2;
 
-/*static TYPELIB set_var_typelib=
+static TYPELIB set_var_typelib=
 {
   array_elements(set_var_names) - 1, "set_var_typelib",
   set_var_names, NULL
 };
-*/
+
 /* MYSQL_SYSVAR_SET(name, varname, opt, comment, check, update, def, typelib) */
 
-/*static MYSQL_SYSVAR_SET(
+static MYSQL_SYSVAR_SET(
   vset,                     // commandline name
   tse_set_var,              // internal variable
   PLUGIN_VAR_SET,           // type of variable = requests an argument
@@ -321,7 +319,7 @@ static MYSQL_SYSVAR_ENUM(
   NULL,
   1,                        // default value
   &set_var_typelib);        // Typelib
-*/
+
 /* Option for errro injection */
 
 static char* tse_inject_var= NULL;
@@ -352,7 +350,7 @@ static struct st_mysql_sys_var* tse_syst
   MYSQL_SYSVAR(vstrmalloc),
   MYSQL_SYSVAR(vstr),
   MYSQL_SYSVAR(venum),
-/*  MYSQL_SYSVAR(vset),*/
+  MYSQL_SYSVAR(vset),
   MYSQL_SYSVAR(vinject),
   NULL
 };


Attachment: [text/bzr-bundle] bzr/azundris@mysql.com-20091021072804-yf0k2e6ahe8gthtd.bundle
Thread
bzr commit into mysql-5.4 branch (azundris:2854) Bug#46586Tatiana A. Nurnberg21 Oct
  • Re: bzr commit into mysql-5.4 branch (azundris:2854) Bug#46586Sergei Golubchik26 Oct
    • Re: bzr commit into mysql-5.4 branch (azundris:2854) Bug#46586Tatiana Azundris27 Oct