List:Commits« Previous MessageNext Message »
From:Kristofer Pettersson Date:March 5 2009 10:41am
Subject:bzr commit into mysql-5.1-bugteam branch (kristofer.pettersson:2825)
Bug#37416
View as plain text  
#At file:///home/thek/Development/cpp/mysqlbzr/mysql-5.1-bugteam/ based on revid:staale.smedseng@stripped

 2825 Kristofer Pettersson	2009-03-05
      Bug#37416 When SQL_NO_CACHE is used, MySQL still lookup into the query cache
                  
      The query cache module did not check for the SQL_NO_CACHE keyword before
      attempting to query the hash lookup table. This had a small performance impact.
      
      By introducing a check on the query string before obtaining the hash mutex
      we can gain some performance if the SQL_NO_CACHE directive is used often.
     @ sql/sql_cache.cc
        * Introduced new helper function, has_no_cache_directive, for checking the
          existance of a SQL_NO_CACHE directive before actual parsing of the query.

    modified:
      sql/sql_cache.cc
=== modified file 'sql/sql_cache.cc'
--- a/sql/sql_cache.cc	2009-02-19 21:09:35 +0000
+++ b/sql/sql_cache.cc	2009-03-05 10:41:19 +0000
@@ -418,6 +418,43 @@ TYPELIB query_cache_type_typelib=
   array_elements(query_cache_type_names)-1,"", query_cache_type_names, NULL
 };
 
+
+/**
+  Helper function for determine if a SELECT statement has a SQL_NO_CACHE
+  directive.
+  
+  @param sql A pointer to the first white space character after SELECT
+  
+  @return
+   @retval TRUE The character string contains SQL_NO_CACHE
+   @retval FALSE No directive found.
+*/
+ 
+static bool has_no_cache_directive(char *sql)
+{
+  int i=0;
+  while (sql[i] == ' ')
+    ++i;
+    
+  if (my_toupper(system_charset_info, sql[i])    == 'S' &&
+      my_toupper(system_charset_info, sql[i+1])  == 'Q' &&
+      my_toupper(system_charset_info, sql[i+2])  == 'L' &&
+      my_toupper(system_charset_info, sql[i+3])  == '_' &&
+      my_toupper(system_charset_info, sql[i+4])  == 'N' &&
+      my_toupper(system_charset_info, sql[i+5])  == 'O' &&
+      my_toupper(system_charset_info, sql[i+6])  == '_' &&
+      my_toupper(system_charset_info, sql[i+7])  == 'C' &&
+      my_toupper(system_charset_info, sql[i+8])  == 'A' &&
+      my_toupper(system_charset_info, sql[i+9])  == 'C' &&
+      my_toupper(system_charset_info, sql[i+10]) == 'H' &&
+      my_toupper(system_charset_info, sql[i+11]) == 'E' &&
+      my_toupper(system_charset_info, sql[i+12]) == ' ')
+    return TRUE;
+  
+  return FALSE;       
+}
+
+
 /*****************************************************************************
  Query_cache_block_table method(s)
 *****************************************************************************/
@@ -1233,6 +1270,16 @@ Query_cache::send_result_to_client(THD *
       DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached"));
       goto err;
     }
+    
+    if (query_length > 20 && has_no_cache_directive(&sql[i+6]))
+    {
+      /*
+        We do not increase 'refused' statistics here since it will be done
+        later when the query is parsed.
+      */
+      DBUG_PRINT("qcache", ("The statement has a SQL_NO_CACHE directive"));
+      goto err;
+    }
   }
 
   STRUCT_LOCK(&structure_guard_mutex);


Attachment: [text/bzr-bundle] bzr/kristofer.pettersson@sun.com-20090305104119-lwggtkxptjqfim1z.bundle
Thread
bzr commit into mysql-5.1-bugteam branch (kristofer.pettersson:2825)Bug#37416Kristofer Pettersson5 Mar