#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