summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2005-12-01 14:26:19 +0200
committerunknown <bell@sanja.is.com.ua>2005-12-01 14:26:19 +0200
commita050707b61d29dec3f39ef89f3102c6a72edb90a (patch)
tree1d52665449d39aa5645cd456959e1dd1920e2fe8
parent598cc2db7dc5c86156929c6c2b88b2e95af427c5 (diff)
downloadmariadb-git-a050707b61d29dec3f39ef89f3102c6a72edb90a.tar.gz
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.
-rw-r--r--mysql-test/r/query_cache.result25
-rw-r--r--mysql-test/t/query_cache.test15
-rw-r--r--sql/sql_cache.cc28
3 files changed, 59 insertions, 9 deletions
diff --git a/mysql-test/r/query_cache.result b/mysql-test/r/query_cache.result
index ed87e2be2b4..24363ea27ab 100644
--- a/mysql-test/r/query_cache.result
+++ b/mysql-test/r/query_cache.result
@@ -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;
diff --git a/mysql-test/t/query_cache.test b/mysql-test/t/query_cache.test
index d08dc5fb352..3140739309e 100644
--- a/mysql-test/t/query_cache.test
+++ b/mysql-test/t/query_cache.test
@@ -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
diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc
index 4214c9a7c07..b40257511f7 100644
--- a/sql/sql_cache.cc
+++ b/sql/sql_cache.cc
@@ -956,16 +956,26 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
goto err;
}
- /*
- 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')
{
- DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached"));
- 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[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);