Commit 534e6933 authored by Georgi Kodinov's avatar Georgi Kodinov

Bug #42144: plugin_load fails

The enum system variables were handled inconsistently 
as ints, unsigned int and unsigned long on various places.
This caused problems on platforms on which 
sizeof(int) != sizeof(long).
Fixed by homogenizing the type of the enum variables
to unsigned int, since it's size compatible with the C enum
type. 
Removed the test from the experimental list.
parent 029bc22b
...@@ -318,7 +318,7 @@ DECLARE_MYSQL_SYSVAR_SIMPLE(name, unsigned long long) = { \ ...@@ -318,7 +318,7 @@ DECLARE_MYSQL_SYSVAR_SIMPLE(name, unsigned long long) = { \
#name, comment, check, update, &varname, def, min, max, blk } #name, comment, check, update, &varname, def, min, max, blk }
#define MYSQL_SYSVAR_ENUM(name, varname, opt, comment, check, update, def, typelib) \ #define MYSQL_SYSVAR_ENUM(name, varname, opt, comment, check, update, def, typelib) \
DECLARE_MYSQL_SYSVAR_TYPELIB(name, unsigned long) = { \ DECLARE_MYSQL_SYSVAR_TYPELIB(name, unsigned int) = { \
PLUGIN_VAR_ENUM | ((opt) & PLUGIN_VAR_MASK), \ PLUGIN_VAR_ENUM | ((opt) & PLUGIN_VAR_MASK), \
#name, comment, check, update, &varname, def, typelib } #name, comment, check, update, &varname, def, typelib }
......
...@@ -14,7 +14,6 @@ funcs_2.ndb_charset # joro : NDB tests marked as experiment ...@@ -14,7 +14,6 @@ funcs_2.ndb_charset # joro : NDB tests marked as experiment
main.ctype_gbk_binlog @solaris # Bug#46010: main.ctype_gbk_binlog fails sporadically : Table 't2' already exists main.ctype_gbk_binlog @solaris # Bug#46010: main.ctype_gbk_binlog fails sporadically : Table 't2' already exists
main.func_str @solaris # joro: Bug#40928 main.func_str @solaris # joro: Bug#40928
main.plugin_load @solaris # Bug#42144
main.sp @solaris # joro : Bug#54138 main.sp @solaris # joro : Bug#54138
main.outfile_loaddata @solaris # joro : Bug #46895 main.outfile_loaddata @solaris # joro : Bug #46895
......
...@@ -656,17 +656,21 @@ static int setval(const struct my_option *opts, void *value, char *argument, ...@@ -656,17 +656,21 @@ static int setval(const struct my_option *opts, void *value, char *argument,
return EXIT_OUT_OF_MEMORY; return EXIT_OUT_OF_MEMORY;
break; break;
case GET_ENUM: case GET_ENUM:
if (((*(int*)result_pos)= {
find_type(argument, opts->typelib, 2) - 1) < 0) int type= find_type(argument, opts->typelib, 2);
if (type < 1)
{ {
/* /*
Accept an integer representation of the enumerated item. Accept an integer representation of the enumerated item.
*/ */
char *endptr; char *endptr;
unsigned int arg= (unsigned int) strtol(argument, &endptr, 10); uint arg= (uint) strtoul(argument, &endptr, 10);
if (*endptr || arg >= opts->typelib->count) if (*endptr || arg >= opts->typelib->count)
return EXIT_ARGUMENT_INVALID; return EXIT_ARGUMENT_INVALID;
*(int*)result_pos= arg; *(uint*)result_pos= arg;
}
else
*(uint*)result_pos= type - 1;
} }
break; break;
case GET_SET: case GET_SET:
......
...@@ -3030,10 +3030,10 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp, ...@@ -3030,10 +3030,10 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp,
Allocate temporary space for the value of the tristate. Allocate temporary space for the value of the tristate.
This option will have a limited lifetime and is not used beyond This option will have a limited lifetime and is not used beyond
server initialization. server initialization.
GET_ENUM value is an integer. GET_ENUM value is unsigned integer.
*/ */
options[0].value= options[1].value= (uchar **)alloc_root(mem_root, options[0].value= options[1].value= (uchar **)alloc_root(mem_root,
sizeof(int)); sizeof(uint));
*((uint*) options[0].value)= *((uint*) options[1].value)= *((uint*) options[0].value)= *((uint*) options[1].value)=
(uint) options[0].def_value; (uint) options[0].def_value;
......
...@@ -848,7 +848,7 @@ int ha_example::create(const char *name, TABLE *table_arg, ...@@ -848,7 +848,7 @@ int ha_example::create(const char *name, TABLE *table_arg,
struct st_mysql_storage_engine example_storage_engine= struct st_mysql_storage_engine example_storage_engine=
{ MYSQL_HANDLERTON_INTERFACE_VERSION }; { MYSQL_HANDLERTON_INTERFACE_VERSION };
static ulong srv_enum_var= 0; static uint srv_enum_var= 0;
static ulong srv_ulong_var= 0; static ulong srv_ulong_var= 0;
const char *enum_var_names[]= const char *enum_var_names[]=
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment