← Back to team overview

maria-developers team mailing list archive

Re: [Commits] 686761f: MDEV-6066: Merge new defaults from 5.6 and 5.7 (part 1 (no hash serch) v2)

 

Hi, Sergei!

I decide to answer before fixing everything, to be able to get your answer earlier.

On 06.08.15 12:01, Sergei Golubchik wrote:
Hi, Sanja!

Summary: The implementation looks very much ok, all comments below are
about details, nothing big.
Well done!

On Jul 14, sanja@xxxxxxxxxxx wrote:
revision-id: 686761fbb0fc36e4fa781b68aba24af21599822d
parent(s): 302bf7c4664b904482ecc133476e822d497b114d
committer: Oleksandr Byelkin
branch nick: server
could you update your post-commit trigger? thanks.
OK

timestamp: 2015-07-14 00:11:25 +0200
message:

MDEV-6066: Merge new defaults from 5.6 and 5.7 (part 1 (no hash serch) v2)

diff --git a/mysql-test/extra/binlog_tests/mysqlbinlog_row_engine.inc b/mysql-test/extra/binlog_tests/mysqlbinlog_row_engine.inc
index 95440ab..c072d50 100644
--- a/mysql-test/extra/binlog_tests/mysqlbinlog_row_engine.inc
+++ b/mysql-test/extra/binlog_tests/mysqlbinlog_row_engine.inc
@@ -16,6 +16,7 @@
  #
--source include/have_log_bin.inc
+set sql_mode="";
please split this big commit in 'new defaults' and 'autoset' commits.
OK

SET NAMES 'utf8';
  #SHOW VARIABLES LIKE 'character_set%';
diff --git a/mysql-test/r/analyze_stmt_privileges.result b/mysql-test/r/analyze_stmt_privileges.result
index d382b0b..05a35e7 100644
--- a/mysql-test/r/analyze_stmt_privileges.result
+++ b/mysql-test/r/analyze_stmt_privileges.result
@@ -7,7 +7,7 @@ use db;
  create table t1 (i int, c varchar(8));
  insert into t1 values (1,'foo'),(2,'bar'),(3,'baz'),(4,'qux');
  create view v1 as select * from t1 where i > 1;
-grant ALL on db.v1 to u1@localhost;
+set statement sql_mode="" for grant ALL on db.v1 to u1@localhost;
heh.
I think it would've been less confusing to put here
an explicit CREATE USER statement
OK

  connect  con1,localhost,u1,,;
  select * from db.t1;
  ERROR 42000: SELECT command denied to user 'u1'@'localhost' for table 't1'
diff --git a/mysql-test/r/blackhole_plugin.result b/mysql-test/r/blackhole_plugin.result
index 4ef9fa0..ab106f8 100644
--- a/mysql-test/r/blackhole_plugin.result
+++ b/mysql-test/r/blackhole_plugin.result
@@ -1,7 +1,9 @@
+set sql_mode="";
you could've put --error 1286 instead.
OK

  CREATE TABLE t1(a int) ENGINE=BLACKHOLE;
  Warnings:
  Warning	1286	Unknown storage engine 'BLACKHOLE'
  Warning	1266	Using storage engine MyISAM for table 't1'
+set sql_mode=default;
  DROP TABLE t1;
  INSTALL PLUGIN blackhole SONAME 'ha_blackhole.so';
  INSTALL PLUGIN BLACKHOLE SONAME 'ha_blackhole.so';
diff --git a/mysql-test/r/change_user.result b/mysql-test/r/change_user.result
index 18c53a5..bd87398 100644
--- a/mysql-test/r/change_user.result
+++ b/mysql-test/r/change_user.result
@@ -1,3 +1,5 @@
+set sql_mode="";
+set global secure_auth=0;
  grant select on test.* to test_nopw;
  grant select on test.* to test_oldpw identified by password "09301740536db389";
  grant select on test.* to test_newpw identified by "newpw";
you could've used "create user" instead of "grant select on test.* to"
and that would work without resetting sql_mode
OK

diff --git a/mysql-test/r/concurrent_innodb_safelog.result b/mysql-test/r/concurrent_innodb_safelog.result
index 24a84af..03d20f4 100644
--- a/mysql-test/r/concurrent_innodb_safelog.result
+++ b/mysql-test/r/concurrent_innodb_safelog.result
@@ -1,4 +1,5 @@
  SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
+SET SQL_MODE="";
same. basically I'd suggest to fix tests instead of setting sql_mode="".
i suspect it's mostly adding create user or replacing grant with create user.
sometimes it's about removing engine=xxx and you're doing that already.
Monty's arguments against was that we will not need to change test if we change default next time.
I.e to keep environment for which test was created.

  SELECT @@global.tx_isolation;
  @@global.tx_isolation
  REPEATABLE-READ
diff --git a/mysql-test/r/func_compress.result b/mysql-test/r/func_compress.result
index 9fde006..4763d87 100644
--- a/mysql-test/r/func_compress.result
+++ b/mysql-test/r/func_compress.result
@@ -1,3 +1,4 @@
+set global max_allowed_packet=1048576;
again, I'd rather fix the test
OK

  select @test_compress_string:='string for test compress function aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ';
  @test_compress_string:='string for test compress function aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa '
  string for test compress function aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/mysql-test/r/host_cache_size_functionality.result b/mysql-test/r/host_cache_size_functionality.result
index e7f9e09..ffa8d71 100644
--- a/mysql-test/r/host_cache_size_functionality.result
+++ b/mysql-test/r/host_cache_size_functionality.result
@@ -9,7 +9,7 @@ SELECT COUNT(@@GLOBAL.Host_Cache_Size)
  set @Default_host_cache_size=128;
  select @@global.Host_Cache_Size=@Default_host_cache_size;
  @@global.Host_Cache_Size=@Default_host_cache_size
-1
+0
  1 Expected
Now that looks weird.
Yes, it was in Monty's review also, but when I test the result alone it was not changed, I'll check how it is happened.

  '#---------------------WL6372_VAR_6_02----------------------#'
  # Restart server with Host_Cache_Size 1
diff --git a/mysql-test/r/index_intersect.result b/mysql-test/r/index_intersect.result
index 1337c3f..edc52db 100644
--- a/mysql-test/r/index_intersect.result
+++ b/mysql-test/r/index_intersect.result
@@ -1035,7 +1032,7 @@ EXPLAIN
  SELECT * FROM t1
  WHERE (f1 < 535  OR  f1 > 985) AND ( f4='r' OR f4 LIKE 'a%' ) ;
  id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
-1	SIMPLE	t1	range	PRIMARY,f4	f4	35	NULL	#	Using index condition; Using where
+1	SIMPLE	t1	index_merge	PRIMARY,f4	PRIMARY,f4	4,39	NULL	#	Using sort_intersect(PRIMARY,f4); Using where
why?
I discussed it, we found nothing, but I'll check.
  SELECT * FROM t1
  WHERE (f1 < 535  OR  f1 > 985) AND ( f4='r' OR f4 LIKE 'a%' ) ;
  f1	f4	f5
diff --git a/mysql-test/r/mysqld--help.result b/mysql-test/r/mysqld--help.result
index fc22af6..1f2a8cf 100644
--- a/mysql-test/r/mysqld--help.result
+++ b/mysql-test/r/mysqld--help.result
@@ -890,6 +890,7 @@ The following options may be given as the first argument:
   write privileges to the mysql.user table.
   --secure-auth       Disallow authentication for accounts that have old
   (pre-4.1) passwords
+ (Defaults to on; use --skip-secure-auth to disable.)
You know what, it would be nice if the user would know what options
support the --autoset prefix. I think here's a good place for it,
the help for back_log can end with

       gets very many connection requests in a very short time
       (Automatically configured unless set explicitly)

Of course, this line should be automatically generated by my_print_help(),
not manually added to the help text of every autoset variable.


   --secure-file-priv=name
   Limit LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE() to
   files within specified directory
diff --git a/mysql-test/r/selectivity.result b/mysql-test/r/selectivity.result
index 620bdc6..4238359 100644
--- a/mysql-test/r/selectivity.result
+++ b/mysql-test/r/selectivity.result
@@ -1298,10 +1298,10 @@ Note	1003	select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`c` A
  select * from t1, t2, t1 as t3
  where t1.b=t2.c and t2.d=t3.a and t3.b<5 and t1.a < 2000;
  a	b	c	d	a	b
-1495	89366	89366	28296	28296	3
-961	24512	24512	85239	85239	4
  1063	89366	89366	28296	28296	3
+1495	89366	89366	28296	28296	3
  221	56120	56120	28296	28296	3
+961	24512	24512	85239	85239	4
why?
now result is sorted (and it should be because there is no order in the statement)

  set optimizer_use_condition_selectivity=3;
  explain extended
  select * from t1, t2, t1 as t3
@@ -1315,10 +1315,10 @@ Note	1003	select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`c` A
  select * from t1, t2, t1 as t3
  where t1.b=t2.c and t2.d=t3.a and t3.b<5 and t1.a < 2000;
  a	b	c	d	a	b
-961	24512	24512	85239	85239	4
-1495	89366	89366	28296	28296	3
  1063	89366	89366	28296	28296	3
+1495	89366	89366	28296	28296	3
  221	56120	56120	28296	28296	3
+961	24512	24512	85239	85239	4
why?
The same - sorted result.
  set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
  drop table t1,t2;
  set histogram_type=@save_histogram_type;
diff --git a/mysql-test/r/selectivity_innodb.result b/mysql-test/r/selectivity_innodb.result
index 0acbb46..daf2807 100644
--- a/mysql-test/r/selectivity_innodb.result
+++ b/mysql-test/r/selectivity_innodb.result
@@ -1308,10 +1308,10 @@ Note	1003	select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`c` A
  select * from t1, t2, t1 as t3
  where t1.b=t2.c and t2.d=t3.a and t3.b<5 and t1.a < 2000;
  a	b	c	d	a	b
-1495	89366	89366	28296	28296	3
-961	24512	24512	85239	85239	4
  1063	89366	89366	28296	28296	3
+1495	89366	89366	28296	28296	3
  221	56120	56120	28296	28296	3
+961	24512	24512	85239	85239	4
why?

The same - sorted result.

  set optimizer_use_condition_selectivity=3;
  explain extended
  select * from t1, t2, t1 as t3
@@ -1325,10 +1325,10 @@ Note	1003	select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`c` A
  select * from t1, t2, t1 as t3
  where t1.b=t2.c and t2.d=t3.a and t3.b<5 and t1.a < 2000;
  a	b	c	d	a	b
-961	24512	24512	85239	85239	4
-1495	89366	89366	28296	28296	3
  1063	89366	89366	28296	28296	3
+1495	89366	89366	28296	28296	3
  221	56120	56120	28296	28296	3
+961	24512	24512	85239	85239	4
why?
The same - sorted result.
  set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
  drop table t1,t2;
  set histogram_type=@save_histogram_type;
diff --git a/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result b/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result
index c314165..bd49492 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result
@@ -167,9 +167,9 @@ def	information_schema	GEOMETRY_COLUMNS	MAX_PPR	12	0	NO	tinyint	NULL	NULL	3	0	NU
  def	information_schema	GEOMETRY_COLUMNS	SRID	13	0	NO	smallint	NULL	NULL	5	0	NULL	NULL	NULL	smallint(5)				
  def	information_schema	GEOMETRY_COLUMNS	STORAGE_TYPE	9	0	NO	tinyint	NULL	NULL	3	0	NULL	NULL	NULL	tinyint(2)				
  def	information_schema	GLOBAL_STATUS	VARIABLE_NAME	1		NO	varchar	64	192	NULL	NULL	NULL	utf8	utf8_general_ci	varchar(64)				
-def	information_schema	GLOBAL_STATUS	VARIABLE_VALUE	2		NO	varchar	1024	3072	NULL	NULL	NULL	utf8	utf8_general_ci	varchar(1024)				
+def	information_schema	GLOBAL_STATUS	VARIABLE_VALUE	2		NO	varchar	2048	6144	NULL	NULL	NULL	utf8	utf8_general_ci	varchar(2048)				
  def	information_schema	GLOBAL_VARIABLES	VARIABLE_NAME	1		NO	varchar	64	192	NULL	NULL	NULL	utf8	utf8_general_ci	varchar(64)				
-def	information_schema	GLOBAL_VARIABLES	VARIABLE_VALUE	2		NO	varchar	1024	3072	NULL	NULL	NULL	utf8	utf8_general_ci	varchar(1024)				
+def	information_schema	GLOBAL_VARIABLES	VARIABLE_VALUE	2		NO	varchar	2048	6144	NULL	NULL	NULL	utf8	utf8_general_ci	varchar(2048)				
why?

  def	information_schema	INDEX_STATISTICS	INDEX_NAME	3		NO	varchar	192	576	NULL	NULL	NULL	utf8	utf8_general_ci	varchar(192)				
  def	information_schema	INDEX_STATISTICS	ROWS_READ	4	0	NO	bigint	NULL	NULL	19	0	NULL	NULL	NULL	bigint(21)				
  def	information_schema	INDEX_STATISTICS	TABLE_NAME	2		NO	varchar	192	576	NULL	NULL	NULL	utf8	utf8_general_ci	varchar(192)				
diff --git a/mysql-test/suite/perfschema/r/stage_mdl_global.result b/mysql-test/suite/perfschema/r/stage_mdl_global.result
index 1a6f51a..de5df8f 100644
--- a/mysql-test/suite/perfschema/r/stage_mdl_global.result
+++ b/mysql-test/suite/perfschema/r/stage_mdl_global.result
@@ -6,6 +6,8 @@ user1	statement/sql/flush	flush tables with read lock
  username	event_name	nesting_event_type
  username	event_name	nesting_event_type
  user1	stage/sql/init	STATEMENT
+user1	stage/sql/Waiting for query cache lock	STATEMENT
+user1	stage/sql/init	STATEMENT
why?
I'll check.

  user1	stage/sql/query end	STATEMENT
  user1	stage/sql/closing tables	STATEMENT
  user1	stage/sql/freeing items	STATEMENT
diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c
index 88fa3d4..1d32833 100644
--- a/mysys/my_getopt.c
+++ b/mysys/my_getopt.c
@@ -47,14 +47,15 @@ static char *check_struct_option(char *cur_arg, char *key_name);
    order of their arguments must correspond to each other.
  */
  static const char *special_opt_prefix[]=
-{"skip", "disable", "enable", "maximum", "loose", 0};
+{"skip", "disable", "enable", "maximum", "loose", "autoset", 0};
So, I'm not very happy with the --autoset- prefix. Because
it cannot be used from the SQL. In SQL we have to use
     SET variable=AUTO;
or something like that. And it would be good to use the same approach
on the command line and from SQL. On the other hand, =AUTO has its problems
too - it conflicts with the AUTO value of the enum/set variables.

I don't have a good answer to this :(
IMHO better to have both, but lets add SET...=AUTOSET when it will be requested.
  static const uint special_opt_prefix_lengths[]=
-{ 4,      7,         6,        7,         5,      0};
+{ 4,      7,         6,        7,         5,       7,        0};
  enum enum_special_opt
-{ OPT_SKIP, OPT_DISABLE, OPT_ENABLE, OPT_MAXIMUM, OPT_LOOSE};
+{ OPT_SKIP, OPT_DISABLE, OPT_ENABLE, OPT_MAXIMUM, OPT_LOOSE, OPT_AUTOSET};
char *disabled_my_option= (char*) "0";
  char *enabled_my_option= (char*) "1";
+char *autoset_my_option= (char*) "";
/*
     This is a flag that can be set in client programs. 0 means that
@@ -458,6 +462,36 @@ int handle_options(int *argc, char ***argv,
  	  }
  	  argument= optend;
  	}
+	else if (option_is_autoset)
+	{
+	  if (optend)
+	  {
+	    my_getopt_error_reporter(ERROR_LEVEL,
+                                     "%s: automatic setup request of "
+                                     "option '--%s' cannot take an argument",
+                                     my_progname, optp->name);
heh, another argument agains --autoset- prefix. With the =AUTO value
one cannot possibly have this error.

So, perhaps, I'm *slighty* leaning towards the =AUTO vs --autoset.

+
+	    DBUG_RETURN(EXIT_NO_ARGUMENT_ALLOWED);
+	  }
+	  /*
+	    We support automatic setup only via get_one_option and only for
+	    marked options.
+	  */
+	  if (!get_one_option ||
+	      !(optp->var_type & GET_AUTO))
+	  {
+	    my_getopt_error_reporter(option_is_loose ?
+				     WARNING_LEVEL : ERROR_LEVEL,
+                                     "%s: automatic setup request is "
+				     "unsupported by option '--%s'",
+                                     my_progname, optp->name);
+	    if (!option_is_loose)
+	      return EXIT_ARGUMENT_INVALID;
+	    continue;
+	  }
+	  else
+            argument= autoset_my_option;
+	}
  	else if (optp->arg_type == REQUIRED_ARG && !optend)
  	{
  	  /* Check if there are more arguments after this one,
diff --git a/sql/set_var.cc b/sql/set_var.cc
index c65ca3d..2251c36 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -1075,7 +1076,7 @@ int fill_sysvars(THD *thd, TABLE_LIST *tables, COND *cond)
      // NUMERIC_MAX_VALUE
      // NUMERIC_BLOCK_SIZE
      bool is_unsigned= true;
-    switch (var->option.var_type)
+    switch (vartype)
ah, yes. thanks.

      {
      case GET_INT:
      case GET_LONG:
@@ -1176,3 +1177,20 @@ void mark_sys_var_value_origin(void *ptr, enum sys_var::where here)
    DBUG_ASSERT(found); // variable must have been found
  }
+enum sys_var::where get_sys_var_value_origin(void *ptr)
+{
+  DBUG_ASSERT(!mysqld_server_started); // only to be used during startup
+
+  for (uint i= 0; i < system_variable_hash.records; i++)
+  {
+    sys_var *var= (sys_var*) my_hash_element(&system_variable_hash, i);
+    if (var->option.value == ptr)
+    {
+      return var->value_origin; //first match
+    }
+  }
+
+  DBUG_ASSERT(1); // variable must have been found
you mean DBUG_ASSERT(0); here
YES

+  return sys_var::CONFIG;
+}
+
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 43a3f0e..21a1198 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -4316,6 +4316,27 @@ static int init_common_variables()
    }
  #endif /* HAVE_SOLARIS_LARGE_PAGES */
+
+  /* Fix host_cache_size. */
+  if (IS_SYSVAR_AUTOSIZE(&host_cache_size))
+  {
+    if (max_connections <= 628 - 128)
+      SYSVAR_AUTOSIZE(host_cache_size, 128 + max_connections);
+    else if (max_connections <= ((ulong)(2000 - 628)) * 20 + 500)
+      SYSVAR_AUTOSIZE(host_cache_size, 628 + ((max_connections - 500) / 20));
+    else
+      SYSVAR_AUTOSIZE(host_cache_size, 2000);
+  }
+
+  /* Fix back_log */
+  if (back_log == 0 || IS_SYSVAR_AUTOSIZE(&back_log))
why back_log==0 ?
MySQL/OLD way to get automatic value, lest for compatibility.

+  {
+    if ((900 - 50) * 5 >= max_connections)
+     SYSVAR_AUTOSIZE(back_log, (50 + max_connections / 5));
+    else
+     SYSVAR_AUTOSIZE(back_log, 900);
+  }
+
    /* connections and databases needs lots of files */
    {
      uint files, wanted_files, max_open_files;
diff --git a/sql/sys_vars.ic b/sql/sys_vars.ic
index 7c0359a..b04bdb5 100644
--- a/sql/sys_vars.ic
+++ b/sql/sys_vars.ic
@@ -226,6 +227,7 @@ class Sys_var_integer: public sys_var
  typedef Sys_var_integer<int, GET_INT, SHOW_SINT> Sys_var_int;
  typedef Sys_var_integer<uint, GET_UINT, SHOW_UINT> Sys_var_uint;
  typedef Sys_var_integer<ulong, GET_ULONG, SHOW_ULONG> Sys_var_ulong;
+typedef Sys_var_integer<ulong, (GET_ULONG|GET_AUTO), SHOW_ULONG> Sys_var_aulong;
Hmm, why did you make it a new type? I think the *type* of the variable
doesn't depend on the auto-set behavior. The type defines storage
size, how to print the value, etc. While auto-set is just a behavior
modifier. I'd rather put it in flags:

-      READ_ONLY GLOBAL_VAR(back_log), CMD_LINE(REQUIRED_ARG),
+      AUTO_SET READ_ONLY GLOBAL_VAR(back_log), CMD_LINE(REQUIRED_ARG),
the problem was in how macro/constructor made, I did not found the way to do it in flags, I will recheck.

  typedef Sys_var_integer<ha_rows, GET_HA_ROWS, SHOW_HA_ROWS> Sys_var_harows;
  typedef Sys_var_integer<ulonglong, GET_ULL, SHOW_ULONGLONG> Sys_var_ulonglong;
  typedef Sys_var_integer<long, GET_LONG, SHOW_SLONG> Sys_var_long;
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index 7a7b9d1..6d90305 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -360,12 +360,12 @@ static Sys_var_mybool Sys_automatic_sp_privileges(
         GLOBAL_VAR(sp_automatic_privileges),
         CMD_LINE(OPT_ARG), DEFAULT(TRUE));
-static Sys_var_ulong Sys_back_log(
+static Sys_var_aulong Sys_back_log(
         "back_log", "The number of outstanding connection requests "
         "MySQL can have. This comes into play when the main MySQL thread "
s/MySQL/MariaDB/ I suppose
yes

         "gets very many connection requests in a very short time",
         READ_ONLY GLOBAL_VAR(back_log), CMD_LINE(REQUIRED_ARG),
-       VALID_RANGE(1, 65535), DEFAULT(150), BLOCK_SIZE(1));
+       VALID_RANGE(0, 65535), DEFAULT(150), BLOCK_SIZE(1));
static Sys_var_charptr Sys_basedir(
         "basedir", "Path to installation directory. All paths are "
@@ -2751,16 +2743,38 @@ static bool check_query_cache_type(sys_var *self, THD *thd, set_var *var)
      my_error(ER_QUERY_CACHE_IS_DISABLED, MYF(0));
      return true;
    }
-  if (var->type != OPT_GLOBAL &&
-      global_system_variables.query_cache_type == 0 &&
-      var->value->val_int() != 0)
+
+  if (var->type != OPT_GLOBAL && global_system_variables.query_cache_type == 0)
    {
-    my_error(ER_QUERY_CACHE_IS_GLOBALY_DISABLED, MYF(0));
-    return true;
-  }
+    uint value= 0 /*default is off*/;
+    if (var->value)
+    {
+      if (var->value->result_type() == INT_RESULT)
+        value= var->value->val_int();
+      else
+      {
+        char buff[STRING_BUFFER_USUAL_SIZE];
+        String str(buff, sizeof(buff), system_charset_info), *res;
+        if (!(res=var->value->val_str(&str)))
+          return true;
+        if (res->length() != 3 ||
+            my_toupper(res->charset(), res->ptr()[0]) != 'O' ||
+            my_toupper(res->charset(), res->ptr()[1]) != 'F' ||
+            my_toupper(res->charset(), res->ptr()[2]) != 'F')
eh? query_cache_type is ENUM variable, there is no need to compare
string values manually.
The problem is that it called before processing, and it was bug before to check only numeric value.

+          value= 1; // set to something not 0
+      }
+    }
+ if (value != 0)
+    {
+      my_error(ER_QUERY_CACHE_IS_GLOBALY_DISABLED, MYF(0));
+      return true;
+    }
+  }
    return false;
  }
+
+
  static bool fix_query_cache_type(sys_var *self, THD *thd, enum_var_type type)
  {
    if (type != OPT_GLOBAL)
diff --git a/unittest/mysys/CMakeLists.txt b/unittest/mysys/CMakeLists.txt
index 8c09a46..6564e09 100644
--- a/unittest/mysys/CMakeLists.txt
+++ b/unittest/mysys/CMakeLists.txt
@@ -13,7 +13,7 @@
  # along with this program; if not, write to the Free Software
  # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
-MY_ADD_TESTS(bitmap base64 my_vsnprintf my_atomic my_rdtsc lf my_malloc
+MY_ADD_TESTS(bitmap base64 my_vsnprintf my_atomic my_rdtsc lf my_malloc my_getopt
Ah, that's great, thanks!
Long overdue.

               LINK_LIBRARIES mysys)
MY_ADD_TESTS(ma_dyncol
Regards,
Sergei



Follow ups

References