Commit a050707b authored by unknown's avatar unknown
Browse files

We should skip beggining '(' characters when test query on possibility

to be in the query cache. (BUG#14652)


mysql-test/r/query_cache.result:
  BUG#14652 test suite.
mysql-test/t/query_cache.test:
  BUG#14652 test suite.
sql/sql_cache.cc:
  We should skip beggining '(' characters when test query on possibility
  to be in the query cache.
parent 598cc2db
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -982,4 +982,29 @@ show status like "Qcache_hits";
Variable_name	Value
Qcache_hits	1
drop table t1;
create table t1 (a int);
flush status;
(select a from t1) union (select a from t1);
a
show status like "Qcache_queries_in_cache";
Variable_name	Value
Qcache_queries_in_cache	1
show status like "Qcache_inserts";
Variable_name	Value
Qcache_inserts	1
show status like "Qcache_hits";
Variable_name	Value
Qcache_hits	0
(select a from t1) union (select a from t1);
a
show status like "Qcache_queries_in_cache";
Variable_name	Value
Qcache_queries_in_cache	1
show status like "Qcache_inserts";
Variable_name	Value
Qcache_inserts	1
show status like "Qcache_hits";
Variable_name	Value
Qcache_hits	1
drop table t1;
set GLOBAL query_cache_size=0;
+15 −0
Original line number Diff line number Diff line
@@ -712,6 +712,21 @@ show status like "Qcache_inserts";
show status like "Qcache_hits";
drop table t1;

#
# BUG#14652: Queries with leading '(' characters.
#
create table t1 (a int);
flush status;
(select a from t1) union (select a from t1);
show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts";
show status like "Qcache_hits";
(select a from t1) union (select a from t1);
show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts";
show status like "Qcache_hits";
drop table t1;

set GLOBAL query_cache_size=0;

# End of 4.1 tests
+19 −9
Original line number Diff line number Diff line
@@ -956,17 +956,27 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
    goto err;
  }

  {
    uint i= 0;
    /*
      Skip '(' characters in queries like following:
      (select a from t1) union (select a from t1);
    */
    while (sql[i]=='(')
      i++;

    /*
      Test if the query is a SELECT
      (pre-space is removed in dispatch_command)
    */
  if (my_toupper(system_charset_info, sql[0]) != 'S' || 
      my_toupper(system_charset_info, sql[1]) != 'E' ||
      my_toupper(system_charset_info,sql[2]) !='L')
    if (my_toupper(system_charset_info, sql[i])     != 'S' ||
        my_toupper(system_charset_info, sql[i + 1]) != 'E' ||
        my_toupper(system_charset_info, sql[i + 2]) != 'L')
    {
      DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached"));
      goto err;
    }
  }

  STRUCT_LOCK(&structure_guard_mutex);
  if (query_cache_size == 0)