summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <gshchepa/uchum@gleb.loc>2007-11-14 15:49:57 +0400
committerunknown <gshchepa/uchum@gleb.loc>2007-11-14 15:49:57 +0400
commit540228dc5bf8e6e163bd2acdaa6bd732be8d5f5f (patch)
tree636ed138297965acac86ed067b64c5d4953a86bf
parentd77cc62d7e0cbf49ce1c9340801f7cea8a90fe6d (diff)
parentf057bbdc26b5e40cae043d31ae2344014d095490 (diff)
downloadmariadb-git-540228dc5bf8e6e163bd2acdaa6bd732be8d5f5f.tar.gz
Merge gleb.loc:/home/uchum/work/bk/5.1-opt-32034
into gleb.loc:/home/uchum/work/bk/5.1-opt
-rw-r--r--mysql-test/r/plugin.result10
-rw-r--r--mysql-test/t/plugin.test15
-rw-r--r--sql/sql_plugin.cc2
-rw-r--r--storage/example/ha_example.cc30
4 files changed, 55 insertions, 2 deletions
diff --git a/mysql-test/r/plugin.result b/mysql-test/r/plugin.result
index 8628acecf55..e4af1535775 100644
--- a/mysql-test/r/plugin.result
+++ b/mysql-test/r/plugin.result
@@ -17,3 +17,13 @@ UNINSTALL PLUGIN EXAMPLE;
ERROR 42000: PLUGIN EXAMPLE does not exist
UNINSTALL PLUGIN non_exist;
ERROR 42000: PLUGIN non_exist does not exist
+#
+# Bug#32034: check_func_enum() does not check correct values but set it
+# to impossible int val
+#
+INSTALL PLUGIN example SONAME 'ha_example.so';
+SET GLOBAL example_enum_var= e1;
+SET GLOBAL example_enum_var= e2;
+SET GLOBAL example_enum_var= impossible;
+ERROR 42000: Variable 'enum_var' can't be set to the value of 'impossible'
+UNINSTALL PLUGIN example;
diff --git a/mysql-test/t/plugin.test b/mysql-test/t/plugin.test
index fb6d5febe45..d8d6d069676 100644
--- a/mysql-test/t/plugin.test
+++ b/mysql-test/t/plugin.test
@@ -24,3 +24,18 @@ UNINSTALL PLUGIN EXAMPLE;
--error 1305
UNINSTALL PLUGIN non_exist;
+
+
+--echo #
+--echo # Bug#32034: check_func_enum() does not check correct values but set it
+--echo # to impossible int val
+--echo #
+
+INSTALL PLUGIN example SONAME 'ha_example.so';
+
+SET GLOBAL example_enum_var= e1;
+SET GLOBAL example_enum_var= e2;
+--error 1231
+SET GLOBAL example_enum_var= impossible;
+
+UNINSTALL PLUGIN example;
diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc
index 2af528f6699..57df53672e7 100644
--- a/sql/sql_plugin.cc
+++ b/sql/sql_plugin.cc
@@ -1944,7 +1944,7 @@ static int check_func_enum(THD *thd, struct st_mysql_sys_var *var,
length= sizeof(buff);
if (!(str= value->val_str(value, buff, &length)))
goto err;
- if ((result= find_type(typelib, str, length, 1)-1) < 0)
+ if ((result= (long)find_type(typelib, str, length, 1)-1) < 0)
{
strvalue= str;
goto err;
diff --git a/storage/example/ha_example.cc b/storage/example/ha_example.cc
index b7186dda676..6d9f4841e06 100644
--- a/storage/example/ha_example.cc
+++ b/storage/example/ha_example.cc
@@ -848,6 +848,34 @@ int ha_example::create(const char *name, TABLE *table_arg,
struct st_mysql_storage_engine example_storage_engine=
{ MYSQL_HANDLERTON_INTERFACE_VERSION };
+static ulong srv_enum_var= 0;
+
+const char *enum_var_names[]=
+{
+ "e1", "e2", NullS
+};
+
+TYPELIB enum_var_typelib=
+{
+ array_elements(enum_var_names) - 1, "enum_var_typelib",
+ enum_var_names, NULL
+};
+
+static MYSQL_SYSVAR_ENUM(
+ enum_var, // name
+ srv_enum_var, // varname
+ PLUGIN_VAR_RQCMDARG, // opt
+ "Sample ENUM system variable.", // comment
+ NULL, // check
+ NULL, // update
+ 0, // def
+ &enum_var_typelib); // typelib
+
+static struct st_mysql_sys_var* example_system_variables[]= {
+ MYSQL_SYSVAR(enum_var),
+ NULL
+};
+
mysql_declare_plugin(example)
{
MYSQL_STORAGE_ENGINE_PLUGIN,
@@ -860,7 +888,7 @@ mysql_declare_plugin(example)
example_done_func, /* Plugin Deinit */
0x0001 /* 0.1 */,
NULL, /* status variables */
- NULL, /* system variables */
+ example_system_variables, /* system variables */
NULL /* config options */
}
mysql_declare_plugin_end;