Fixed that prepared statements are properly igored (if possible) by query cache.
This commit is contained in:
parent
3efc8d016f
commit
ea45d770af
@ -1659,6 +1659,17 @@ Query_cache::send_result_to_client(THD *thd, char *org_sql, uint query_length)
|
|||||||
if (is_disabled() || thd->locked_tables ||
|
if (is_disabled() || thd->locked_tables ||
|
||||||
thd->variables.query_cache_type == 0)
|
thd->variables.query_cache_type == 0)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
/*
|
||||||
|
The following can only happen for prepared statements that was found
|
||||||
|
during parsing or later that the query was not cacheable.
|
||||||
|
*/
|
||||||
|
if (!thd->lex->safe_to_cache_query)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("qcache", ("SELECT is non-cacheable"));
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
DBUG_ASSERT(query_cache_size != 0); // otherwise cache would be disabled
|
DBUG_ASSERT(query_cache_size != 0); // otherwise cache would be disabled
|
||||||
|
|
||||||
thd->query_cache_is_applicable= 1;
|
thd->query_cache_is_applicable= 1;
|
||||||
@ -1950,6 +1961,7 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
|
|||||||
faster.
|
faster.
|
||||||
*/
|
*/
|
||||||
thd->query_cache_is_applicable= 0; // Query can't be cached
|
thd->query_cache_is_applicable= 0; // Query can't be cached
|
||||||
|
thd->lex->safe_to_cache_query= 0; // For prepared statements
|
||||||
BLOCK_UNLOCK_RD(query_block);
|
BLOCK_UNLOCK_RD(query_block);
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
@ -1966,6 +1978,7 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
|
|||||||
table_list.db, table_list.alias));
|
table_list.db, table_list.alias));
|
||||||
unlock();
|
unlock();
|
||||||
thd->query_cache_is_applicable= 0; // Query can't be cached
|
thd->query_cache_is_applicable= 0; // Query can't be cached
|
||||||
|
thd->lex->safe_to_cache_query= 0; // For prepared statements
|
||||||
BLOCK_UNLOCK_RD(query_block);
|
BLOCK_UNLOCK_RD(query_block);
|
||||||
DBUG_RETURN(-1); // Privilege error
|
DBUG_RETURN(-1); // Privilege error
|
||||||
}
|
}
|
||||||
@ -1975,6 +1988,7 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
|
|||||||
table_list.db, table_list.alias));
|
table_list.db, table_list.alias));
|
||||||
BLOCK_UNLOCK_RD(query_block);
|
BLOCK_UNLOCK_RD(query_block);
|
||||||
thd->query_cache_is_applicable= 0; // Query can't be cached
|
thd->query_cache_is_applicable= 0; // Query can't be cached
|
||||||
|
thd->lex->safe_to_cache_query= 0; // For prepared statements
|
||||||
goto err_unlock; // Parse query
|
goto err_unlock; // Parse query
|
||||||
}
|
}
|
||||||
#endif /*!NO_EMBEDDED_ACCESS_CHECKS*/
|
#endif /*!NO_EMBEDDED_ACCESS_CHECKS*/
|
||||||
@ -1998,7 +2012,13 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
|
|||||||
table->key_length());
|
table->key_length());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
As this can change from call to call, don't reset set
|
||||||
|
thd->lex->safe_to_cache_query
|
||||||
|
*/
|
||||||
thd->query_cache_is_applicable= 0; // Query can't be cached
|
thd->query_cache_is_applicable= 0; // Query can't be cached
|
||||||
|
}
|
||||||
goto err_unlock; // Parse query
|
goto err_unlock; // Parse query
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -3886,6 +3906,7 @@ Query_cache::process_and_count_tables(THD *thd, TABLE_LIST *tables_used,
|
|||||||
DBUG_PRINT("qcache", ("Don't cache statement as it refers to "
|
DBUG_PRINT("qcache", ("Don't cache statement as it refers to "
|
||||||
"tables with column privileges."));
|
"tables with column privileges."));
|
||||||
thd->query_cache_is_applicable= 0; // Query can't be cached
|
thd->query_cache_is_applicable= 0; // Query can't be cached
|
||||||
|
thd->lex->safe_to_cache_query= 0; // For prepared statements
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -4022,6 +4043,10 @@ my_bool Query_cache::ask_handler_allowance(THD *thd,
|
|||||||
{
|
{
|
||||||
DBUG_PRINT("qcache", ("Handler does not allow caching for %s.%s",
|
DBUG_PRINT("qcache", ("Handler does not allow caching for %s.%s",
|
||||||
tables_used->db, tables_used->alias));
|
tables_used->db, tables_used->alias));
|
||||||
|
/*
|
||||||
|
As this can change from call to call, don't reset set
|
||||||
|
thd->lex->safe_to_cache_query
|
||||||
|
*/
|
||||||
thd->query_cache_is_applicable= 0; // Query can't be cached
|
thd->query_cache_is_applicable= 0; // Query can't be cached
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user