2002-03-22 21:55:08 +01:00
|
|
|
|
-- source include/have_query_cache.inc
|
|
|
|
|
|
2001-12-06 00:05:30 +01:00
|
|
|
|
#
|
|
|
|
|
# Tests with query cache
|
|
|
|
|
#
|
2003-09-15 14:16:13 +02:00
|
|
|
|
set GLOBAL query_cache_size=1355776;
|
2001-12-06 00:05:30 +01:00
|
|
|
|
|
|
|
|
|
# Reset query cache variables.
|
|
|
|
|
|
2001-12-13 01:31:19 +01:00
|
|
|
|
flush query cache; # This crashed in some versions
|
|
|
|
|
flush query cache; # This crashed in some versions
|
2001-12-06 00:05:30 +01:00
|
|
|
|
reset query cache;
|
|
|
|
|
flush status;
|
2003-01-06 00:48:59 +01:00
|
|
|
|
--disable_warnings
|
2006-02-26 14:11:56 +01:00
|
|
|
|
drop table if exists t1,t2,t3,t4,t11,t21,t1_1,t1_2,t9,t9_1,t9_2;
|
2003-01-06 00:48:59 +01:00
|
|
|
|
drop database if exists mysqltest;
|
Table definition cache, part 2
The table opening process now works the following way:
- Create common TABLE_SHARE object
- Read the .frm file and unpack it into the TABLE_SHARE object
- Create a TABLE object based on the information in the TABLE_SHARE
object and open a handler to the table object
Other noteworthy changes:
- In TABLE_SHARE the most common strings are now LEX_STRING's
- Better error message when table is not found
- Variable table_cache is now renamed 'table_open_cache'
- New variable 'table_definition_cache' that is the number of table defintions that will be cached
- strxnmov() calls are now fixed to avoid overflows
- strxnmov() will now always add one end \0 to result
- engine objects are now created with a TABLE_SHARE object instead of a TABLE object.
- After creating a field object one must call field->init(table) before using it
- For a busy system this change will give you:
- Less memory usage for table object
- Faster opening of tables (if it's has been in use or is in table definition cache)
- Allow you to cache many table definitions objects
- Faster drop of table
mysql-test/mysql-test-run.sh:
Fixed some problems with --gdb option
Test both with socket and tcp/ip port that all old servers are killed
mysql-test/r/flush_table.result:
More tests with lock table with 2 threads + flush table
mysql-test/r/information_schema.result:
Removed old (now wrong) result
mysql-test/r/innodb.result:
Better error messages (thanks to TDC patch)
mysql-test/r/merge.result:
Extra flush table test
mysql-test/r/ndb_bitfield.result:
Better error messages (thanks to TDC patch)
mysql-test/r/ndb_partition_error.result:
Better error messages (thanks to TDC patch)
mysql-test/r/query_cache.result:
Remove tables left from old tests
mysql-test/r/temp_table.result:
Test truncate with temporary tables
mysql-test/r/variables.result:
Table_cache -> Table_open_cache
mysql-test/t/flush_table.test:
More tests with lock table with 2 threads + flush table
mysql-test/t/merge.test:
Extra flush table test
mysql-test/t/multi_update.test:
Added 'sleep' to make test predictable
mysql-test/t/query_cache.test:
Remove tables left from old tests
mysql-test/t/temp_table.test:
Test truncate with temporary tables
mysql-test/t/variables.test:
Table_cache -> Table_open_cache
mysql-test/valgrind.supp:
Remove warning that may happens becasue threads dies in different order
mysys/hash.c:
Fixed wrong DBUG_PRINT
mysys/mf_dirname.c:
More DBUG
mysys/mf_pack.c:
Better comment
mysys/mf_tempdir.c:
More DBUG
Ensure that we call cleanup_dirname() on all temporary directory paths.
If we don't do this, we will get a failure when comparing temporary table
names as in some cases the temporary table name is run through convert_dirname())
mysys/my_alloc.c:
Indentation fix
sql/examples/ha_example.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/examples/ha_example.h:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/examples/ha_tina.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/examples/ha_tina.h:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/field.cc:
Update for table definition cache:
- Field creation now takes TABLE_SHARE instead of TABLE as argument
(This is becasue field definitions are now cached in TABLE_SHARE)
When a field is created, one now must call field->init(TABLE) before using it
- Use s->db instead of s->table_cache_key
- Added Field::clone() to create a field in TABLE from a field in TABLE_SHARE
- make_field() takes TABLE_SHARE as argument instead of TABLE
- move_field() -> move_field_offset()
sql/field.h:
Update for table definition cache:
- Field creation now takes TABLE_SHARE instead of TABLE as argument
(This is becasue field definitions are now cached in TABLE_SHARE)
When a field is created, one now must call field->init(TABLE) before using it
- Added Field::clone() to create a field in TABLE from a field in TABLE_SHARE
- make_field() takes TABLE_SHARE as argument instead of TABLE
- move_field() -> move_field_offset()
sql/ha_archive.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/ha_archive.h:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/ha_berkeley.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
Changed name of argument create() to not hide internal 'table' variable.
table->s -> table_share
sql/ha_berkeley.h:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/ha_blackhole.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/ha_blackhole.h:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/ha_federated.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
Fixed comments
Remove index variable and replace with pointers (simple optimization)
move_field() -> move_field_offset()
Removed some strlen() calls
sql/ha_federated.h:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/ha_heap.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
Simplify delete_table() and create() as the given file names are now without extension
sql/ha_heap.h:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/ha_innodb.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/ha_innodb.h:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/ha_myisam.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
Remove not needed fn_format()
Fixed for new table->s structure
sql/ha_myisam.h:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/ha_myisammrg.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
Don't set 'is_view' for MERGE tables
Use new interface to find_temporary_table()
sql/ha_myisammrg.h:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
Added flag HA_NO_COPY_ON_ALTER
sql/ha_ndbcluster.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
Fixed wrong calls to strxnmov()
Give error HA_ERR_TABLE_DEF_CHANGED if table definition has changed
drop_table -> intern_drop_table()
table->s -> table_share
Move part_info to TABLE
Fixed comments & DBUG print's
New arguments to print_error()
sql/ha_ndbcluster.h:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
sql/ha_partition.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
We can't set up or use part_info when creating handler as there is not yet any table object
New ha_intialise() to work with TDC (Done by Mikael)
sql/ha_partition.h:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
Got set_part_info() from Mikael
sql/handler.cc:
We new use TABLE_SHARE instead of TABLE when creating engine handlers
ha_delete_table() now also takes database as an argument
handler::ha_open() now takes TABLE as argument
ha_open() now calls ha_allocate_read_write_set()
Simplify ha_allocate_read_write_set()
Remove ha_deallocate_read_write_set()
Use table_share (Cached by table definition cache)
sql/handler.h:
New table flag: HA_NO_COPY_ON_ALTER (used by merge tables)
Remove ha_deallocate_read_write_set()
get_new_handler() now takes TABLE_SHARE as argument
ha_delete_table() now gets database as argument
sql/item.cc:
table_name and db are now LEX_STRING objects
When creating fields, we have now have to call field->init(table)
move_field -> move_field_offset()
sql/item.h:
tmp_table_field_from_field_type() now takes an extra paramenter 'fixed_length' to allow one to force usage of CHAR
instead of BLOB
sql/item_cmpfunc.cc:
Fixed call to tmp_table_field_from_field_type()
sql/item_create.cc:
Assert if new not handled cast type
sql/item_func.cc:
When creating fields, we have now have to call field->init(table)
dummy_table used by 'sp' now needs a TABLE_SHARE object
sql/item_subselect.cc:
Trivial code cleanups
sql/item_sum.cc:
When creating fields, we have now have to call field->init(table)
sql/item_timefunc.cc:
Item_func_str_to_date::tmp_table_field() now replaced by call to
tmp_table_field_from_field_type() (see item_timefunc.h)
sql/item_timefunc.h:
Simply tmp_table_field()
sql/item_uniq.cc:
When creating fields, we have now have to call field->init(table)
sql/key.cc:
Added 'KEY' argument to 'find_ref_key' to simplify code
sql/lock.cc:
More debugging
Use create_table_def_key() to create key for table cache
Allocate TABLE_SHARE properly when creating name lock
Fix that locked_table_name doesn't test same table twice
sql/mysql_priv.h:
New functions for table definition cache
New interfaces to a lot of functions.
New faster interface to find_temporary_table() and close_temporary_table()
sql/mysqld.cc:
Added support for table definition cache of size 'table_def_size'
Fixed som calls to strnmov()
Changed name of 'table_cache' to 'table_open_cache'
sql/opt_range.cc:
Use new interfaces
Fixed warnings from valgrind
sql/parse_file.cc:
Safer calls to strxnmov()
Fixed typo
sql/set_var.cc:
Added variable 'table_definition_cache'
Variable table_cache renamed to 'table_open_cache'
sql/slave.cc:
Use new interface
sql/sp.cc:
Proper use of TABLE_SHARE
sql/sp_head.cc:
Remove compiler warnings
We have now to call field->init(table)
sql/sp_head.h:
Pointers to parsed strings are now const
sql/sql_acl.cc:
table_name is now a LEX_STRING
sql/sql_base.cc:
Main implementation of table definition cache
(The #ifdef's are there for the future when table definition cache will replace open table cache)
Now table definitions are cached indepndent of open tables, which will speed up things when a table is in use at once from several places
Views are not yet cached; For the moment we only cache if a table is a view or not.
Faster implementation of find_temorary_table()
Replace 'wait_for_refresh()' with the more general function 'wait_for_condition()'
Drop table is slightly faster as we can use the table definition cache to know the type of the table
sql/sql_cache.cc:
table_cache_key and table_name are now LEX_STRING
'sDBUG print fixes
sql/sql_class.cc:
table_cache_key is now a LEX_STRING
safer strxnmov()
sql/sql_class.h:
Added number of open table shares (table definitions)
sql/sql_db.cc:
safer strxnmov()
sql/sql_delete.cc:
Use new interface to find_temporary_table()
sql/sql_derived.cc:
table_name is now a LEX_STRING
sql/sql_handler.cc:
TABLE_SHARE->db and TABLE_SHARE->table_name are now LEX_STRING's
sql/sql_insert.cc:
TABLE_SHARE->db and TABLE_SHARE->table_name are now LEX_STRING's
sql/sql_lex.cc:
Make parsed string a const (to quickly find out if anything is trying to change the query string)
sql/sql_lex.h:
Make parsed string a const (to quickly find out if anything is trying to change the query string)
sql/sql_load.cc:
Safer strxnmov()
sql/sql_parse.cc:
Better error if wrong DB name
sql/sql_partition.cc:
part_info moved to TABLE from TABLE_SHARE
Indentation changes
sql/sql_select.cc:
Indentation fixes
Call field->init(TABLE) for new created fields
Update create_tmp_table() to use TABLE_SHARE properly
sql/sql_select.h:
Call field->init(TABLE) for new created fields
sql/sql_show.cc:
table_name is now a LEX_STRING
part_info moved to TABLE
sql/sql_table.cc:
Use table definition cache to speed up delete of tables
Fixed calls to functions with new interfaces
Don't use 'share_not_to_be_used'
Instead of doing openfrm() when doing repair, we now have to call
get_table_share() followed by open_table_from_share().
Replace some fn_format() with faster unpack_filename().
Safer strxnmov()
part_info is now in TABLE
Added Mikaels patch for partition and ALTER TABLE
Instead of using 'TABLE_SHARE->is_view' use 'table_flags() & HA_NO_COPY_ON_ALTER
sql/sql_test.cc:
table_name and table_cache_key are now LEX_STRING's
sql/sql_trigger.cc:
TABLE_SHARE->db and TABLE_SHARE->table_name are now LEX_STRING's
safer strxnmov()
Removed compiler warnings
sql/sql_update.cc:
Call field->init(TABLE) after field is created
sql/sql_view.cc:
safer strxnmov()
Create common TABLE_SHARE object for views to allow us to cache if table is a view
sql/structs.h:
Added SHOW_TABLE_DEFINITIONS
sql/table.cc:
Creation and destruct of TABLE_SHARE objects that are common for many TABLE objects
The table opening process now works the following way:
- Create common TABLE_SHARE object
- Read the .frm file and unpack it into the TABLE_SHARE object
- Create a TABLE object based on the information in the TABLE_SHARE
object and open a handler to the table object
open_table_def() is written in such a way that it should be trival to add parsing of the .frm files in new formats
sql/table.h:
TABLE objects for the same database table now share a common TABLE_SHARE object
In TABLE_SHARE the most common strings are now LEX_STRING's
sql/unireg.cc:
Changed arguments to rea_create_table() to have same order as other functions
Call field->init(table) for new created fields
sql/unireg.h:
Added OPEN_VIEW
strings/strxnmov.c:
Change strxnmov() to always add end \0
This makes usage of strxnmov() safer as most of MySQL code assumes that strxnmov() will create a null terminated string
2005-11-23 21:45:02 +01:00
|
|
|
|
|
|
|
|
|
# Fix possible left overs from other tests
|
|
|
|
|
drop table if exists ```a`;
|
|
|
|
|
drop view if exists v1;
|
2003-01-06 00:48:59 +01:00
|
|
|
|
--enable_warnings
|
2001-12-09 23:08:24 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# First simple test
|
|
|
|
|
#
|
|
|
|
|
|
2001-12-06 00:05:30 +01:00
|
|
|
|
create table t1 (a int not null);
|
|
|
|
|
insert into t1 values (1),(2),(3);
|
|
|
|
|
select * from t1;
|
|
|
|
|
select * from t1;
|
|
|
|
|
select sql_no_cache * from t1;
|
|
|
|
|
select length(now()) from t1;
|
|
|
|
|
|
|
|
|
|
# Only check the variables that are independent of the machine and startup
|
|
|
|
|
# options
|
|
|
|
|
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
show status like "Qcache_inserts";
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2001-12-09 23:08:24 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# MERGE TABLES with INSERT/UPDATE and DELETE
|
|
|
|
|
#
|
|
|
|
|
create table t1 (a int not null);
|
|
|
|
|
insert into t1 values (1),(2),(3);
|
|
|
|
|
create table t2 (a int not null);
|
|
|
|
|
insert into t2 values (4),(5),(6);
|
2003-12-10 05:31:42 +01:00
|
|
|
|
create table t3 (a int not null) engine=MERGE UNION=(t1,t2) INSERT_METHOD=FIRST;
|
2001-12-09 23:08:24 +01:00
|
|
|
|
# insert
|
|
|
|
|
select * from t3;
|
|
|
|
|
select * from t3;
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
insert into t2 values (7);
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
select * from t1;
|
|
|
|
|
select * from t1;
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
insert into t3 values (8);
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
# update
|
|
|
|
|
select * from t3;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
update t2 set a=9 where a=7;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
select * from t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
update t3 set a=10 where a=1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
#delete
|
|
|
|
|
select * from t3;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
delete from t2 where a=9;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
select * from t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
delete from t3 where a=10;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
drop table t1, t2, t3;
|
|
|
|
|
#
|
|
|
|
|
# SELECT SQL_CACHE ...
|
|
|
|
|
#
|
2002-07-23 17:31:22 +02:00
|
|
|
|
set query_cache_type=demand;
|
2001-12-09 23:08:24 +01:00
|
|
|
|
create table t1 (a int not null);
|
|
|
|
|
insert into t1 values (1),(2),(3);
|
|
|
|
|
select * from t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2003-02-27 21:26:09 +01:00
|
|
|
|
select sql_cache * from t1 union select * from t1;
|
2002-07-23 17:31:22 +02:00
|
|
|
|
set query_cache_type=2;
|
2003-02-27 21:26:09 +01:00
|
|
|
|
select sql_cache * from t1 union select * from t1;
|
|
|
|
|
select * from t1 union select sql_cache * from t1;
|
2001-12-09 23:08:24 +01:00
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2002-07-23 17:31:22 +02:00
|
|
|
|
set query_cache_type=on;
|
2001-12-09 23:08:24 +01:00
|
|
|
|
#
|
|
|
|
|
# RESET QUERY CACHE
|
|
|
|
|
#
|
|
|
|
|
reset query cache;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
#
|
|
|
|
|
# SELECT SQL_NO_CACHE
|
|
|
|
|
#
|
|
|
|
|
select sql_no_cache * from t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
drop table t1;
|
|
|
|
|
#
|
|
|
|
|
# Check that queries that uses NOW(), LAST_INSERT_ID()... are not cached.
|
|
|
|
|
#
|
|
|
|
|
create table t1 (a text not null);
|
|
|
|
|
select CONNECTION_ID() from t1;
|
|
|
|
|
#GET_LOCK
|
|
|
|
|
#RELEASE_LOCK
|
|
|
|
|
#LOAD_FILE
|
|
|
|
|
select FOUND_ROWS();
|
|
|
|
|
select NOW() from t1;
|
|
|
|
|
select CURDATE() from t1;
|
|
|
|
|
select CURTIME() from t1;
|
|
|
|
|
select DATABASE() from t1;
|
|
|
|
|
select ENCRYPT("test") from t1;
|
|
|
|
|
select LAST_INSERT_ID() from t1;
|
|
|
|
|
select RAND() from t1;
|
|
|
|
|
select UNIX_TIMESTAMP() from t1;
|
|
|
|
|
select USER() from t1;
|
2005-04-10 22:30:23 +02:00
|
|
|
|
select CURRENT_USER() from t1;
|
2001-12-09 23:08:24 +01:00
|
|
|
|
select benchmark(1,1) from t1;
|
2003-10-30 11:57:26 +01:00
|
|
|
|
explain extended select benchmark(1,1) from t1;
|
2001-12-09 23:08:24 +01:00
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
#
|
|
|
|
|
# Tests when the cache is filled
|
|
|
|
|
#
|
|
|
|
|
create table t2 (a text not null);
|
|
|
|
|
insert into t1 values("1111111111111111111111111111111111111111111111111111");
|
|
|
|
|
insert into t2 select * from t1;
|
|
|
|
|
insert into t1 select * from t2; # 2
|
|
|
|
|
insert into t2 select * from t1; # 3
|
|
|
|
|
insert into t1 select * from t2; # 5
|
|
|
|
|
insert into t2 select * from t1; # 8
|
|
|
|
|
insert into t1 select * from t2; # 13
|
|
|
|
|
insert into t2 select * from t1; # 21
|
|
|
|
|
insert into t1 select * from t2; # 34
|
|
|
|
|
insert into t2 select * from t1; # 55
|
|
|
|
|
insert into t1 select * from t2; # 89
|
|
|
|
|
insert into t2 select * from t1; # 144
|
|
|
|
|
insert into t1 select * from t2; # 233
|
|
|
|
|
insert into t2 select * from t1; # 357
|
|
|
|
|
insert into t1 select * from t2; # 610
|
|
|
|
|
insert into t2 select * from t1; # 987
|
|
|
|
|
insert into t1 select * from t2; # 1597
|
|
|
|
|
insert into t2 select * from t1; # 2584
|
|
|
|
|
insert into t1 select * from t2; # 4181
|
|
|
|
|
|
|
|
|
|
show status like "Qcache_hits";
|
2002-11-17 19:41:25 +01:00
|
|
|
|
show status like "Qcache_lowmem_prunes";
|
2001-12-09 23:08:24 +01:00
|
|
|
|
disable_result_log;
|
|
|
|
|
select a as a1, a as a2 from t1;
|
|
|
|
|
select a as a2, a as a3 from t1;
|
|
|
|
|
select a as a3, a as a4 from t1;
|
|
|
|
|
# next query must be out of 1Mb cache
|
|
|
|
|
select a as a1, a as a2 from t1;
|
|
|
|
|
enable_result_log;
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2002-11-17 19:41:25 +01:00
|
|
|
|
show status like "Qcache_lowmem_prunes";
|
2001-12-09 23:08:24 +01:00
|
|
|
|
reset query cache;
|
2001-12-14 15:02:41 +01:00
|
|
|
|
#
|
|
|
|
|
# Query bigger then query_cache_limit
|
|
|
|
|
#
|
|
|
|
|
insert into t2 select * from t1;
|
|
|
|
|
insert into t1 select * from t2;
|
|
|
|
|
insert into t2 select * from t1;
|
|
|
|
|
insert into t1 select * from t2;
|
|
|
|
|
insert into t2 select * from t1;
|
|
|
|
|
insert into t1 select * from t2;
|
|
|
|
|
insert into t2 select * from t1;
|
|
|
|
|
insert into t1 select * from t2;
|
|
|
|
|
insert into t2 select * from t1;
|
|
|
|
|
insert into t1 select * from t2;
|
|
|
|
|
disable_result_log;
|
|
|
|
|
select * from t1;
|
|
|
|
|
enable_result_log;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
drop table t1,t2;
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# noncachable ODBC work around (and prepare cache for drop database)
|
|
|
|
|
#
|
2003-07-03 10:55:36 +02:00
|
|
|
|
create database mysqltest;
|
2001-12-22 14:13:31 +01:00
|
|
|
|
create table mysqltest.t1 (i int not null auto_increment, a int, primary key (i));
|
|
|
|
|
insert into mysqltest.t1 (a) values (1);
|
|
|
|
|
select * from mysqltest.t1 where i is null;
|
2001-12-14 15:02:41 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# drop db
|
|
|
|
|
#
|
2003-11-20 17:12:49 +01:00
|
|
|
|
create table t1(a int);
|
|
|
|
|
select * from t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2001-12-22 14:13:31 +01:00
|
|
|
|
select * from mysqltest.t1;
|
2001-12-14 15:02:41 +01:00
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2001-12-22 14:13:31 +01:00
|
|
|
|
drop database mysqltest;
|
2001-12-14 15:02:41 +01:00
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2003-11-20 17:12:49 +01:00
|
|
|
|
drop table t1;
|
2001-12-20 05:14:11 +01:00
|
|
|
|
|
2001-12-14 15:02:41 +01:00
|
|
|
|
#
|
2006-05-02 15:13:58 +02:00
|
|
|
|
# Charset conversion (cp1251_koi8 always present)
|
2001-12-14 15:02:41 +01:00
|
|
|
|
#
|
2003-07-28 17:28:44 +02:00
|
|
|
|
create table t1 (a char(1) not null collate koi8r_general_ci);
|
|
|
|
|
insert into t1 values(_koi8r"<22>");
|
|
|
|
|
set CHARACTER SET koi8r;
|
2001-12-14 15:02:41 +01:00
|
|
|
|
select * from t1;
|
|
|
|
|
set CHARACTER SET cp1251_koi8;
|
|
|
|
|
select * from t1;
|
|
|
|
|
set CHARACTER SET DEFAULT;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2001-12-23 01:43:46 +01:00
|
|
|
|
show status like "Qcache_hits";
|
2001-12-09 23:08:24 +01:00
|
|
|
|
drop table t1;
|
2001-12-10 17:16:51 +01:00
|
|
|
|
|
|
|
|
|
# The following tests can't be done as the values differen on 32 and 64 bit
|
|
|
|
|
# machines :(
|
|
|
|
|
#show variables like "query_cache_size";
|
|
|
|
|
#show status like "Qcache_free_memory";
|
2001-12-20 05:14:11 +01:00
|
|
|
|
|
2001-12-23 01:43:46 +01:00
|
|
|
|
#
|
|
|
|
|
# same tables in different db
|
|
|
|
|
#
|
|
|
|
|
create database if not exists mysqltest;
|
|
|
|
|
create table mysqltest.t1 (i int not null);
|
|
|
|
|
create table t1 (i int not null);
|
|
|
|
|
insert into mysqltest.t1 (i) values (1);
|
|
|
|
|
insert into t1 (i) values (2);
|
|
|
|
|
|
|
|
|
|
select * from t1;
|
|
|
|
|
use mysqltest;
|
|
|
|
|
select * from t1;
|
|
|
|
|
select * from t1;
|
|
|
|
|
use test;
|
|
|
|
|
select * from t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
|
|
|
|
|
drop database mysqltest;
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
2002-01-02 20:29:41 +01:00
|
|
|
|
#
|
|
|
|
|
# FOUND_ROWS()
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
create table t1 (i int not null);
|
|
|
|
|
insert into t1 (i) values (1),(2),(3),(4);
|
|
|
|
|
|
|
|
|
|
select SQL_CALC_FOUND_ROWS * from t1 limit 2;
|
|
|
|
|
select FOUND_ROWS();
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
|
|
|
|
|
select * from t1 where i=1;
|
|
|
|
|
select FOUND_ROWS();
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
|
|
|
|
|
select SQL_CALC_FOUND_ROWS * from t1 limit 2;
|
|
|
|
|
select FOUND_ROWS();
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
|
|
|
|
|
select * from t1 where i=1;
|
|
|
|
|
select FOUND_ROWS();
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
2001-12-20 05:14:11 +01:00
|
|
|
|
#
|
|
|
|
|
# Test insert delayed
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
flush query cache;
|
|
|
|
|
reset query cache;
|
|
|
|
|
|
|
|
|
|
create table t1 (a int not null);
|
|
|
|
|
insert into t1 values (1),(2),(3);
|
|
|
|
|
select * from t1;
|
|
|
|
|
select * from t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
insert delayed into t1 values (4);
|
|
|
|
|
--sleep 5 # Wait for insert delayed to be executed.
|
|
|
|
|
select a from t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
drop table t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2002-07-28 21:36:34 +02:00
|
|
|
|
|
2003-03-02 20:39:03 +01:00
|
|
|
|
#
|
|
|
|
|
# Test of min result data unit size changing
|
|
|
|
|
#
|
|
|
|
|
show global variables like "query_cache_min_res_unit";
|
|
|
|
|
set GLOBAL query_cache_min_res_unit=1001;
|
|
|
|
|
show global variables like "query_cache_min_res_unit";
|
|
|
|
|
create table t1 (a int not null);
|
|
|
|
|
insert into t1 values (1),(2),(3);
|
|
|
|
|
create table t2 (a int not null);
|
|
|
|
|
insert into t2 values (1),(2),(3);
|
|
|
|
|
select * from t1;
|
|
|
|
|
select * from t1;
|
|
|
|
|
select * from t2;
|
|
|
|
|
select * from t2;
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
drop table t1;
|
|
|
|
|
select a from t2;
|
|
|
|
|
select a from t2;
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
drop table t2;
|
|
|
|
|
set GLOBAL query_cache_min_res_unit=default;
|
|
|
|
|
show global variables like "query_cache_min_res_unit";
|
|
|
|
|
|
2003-07-28 17:28:44 +02:00
|
|
|
|
#
|
|
|
|
|
# Case sensitive test
|
|
|
|
|
#
|
|
|
|
|
create table t1 (a int not null);
|
|
|
|
|
insert into t1 values (1);
|
|
|
|
|
select "aaa" from t1;
|
|
|
|
|
select "AAA" from t1;
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
2002-07-28 21:36:34 +02:00
|
|
|
|
#
|
|
|
|
|
# Test of query cache resizing
|
|
|
|
|
#
|
2003-05-31 00:41:11 +02:00
|
|
|
|
create table t1 (a int);
|
2002-07-28 21:36:34 +02:00
|
|
|
|
set GLOBAL query_cache_size=1000;
|
|
|
|
|
show global variables like "query_cache_size";
|
2003-05-31 00:41:11 +02:00
|
|
|
|
select * from t1;
|
|
|
|
|
set GLOBAL query_cache_size=1024;
|
|
|
|
|
show global variables like "query_cache_size";
|
|
|
|
|
select * from t1;
|
|
|
|
|
set GLOBAL query_cache_size=10240;
|
|
|
|
|
show global variables like "query_cache_size";
|
|
|
|
|
select * from t1;
|
|
|
|
|
set GLOBAL query_cache_size=20480;
|
|
|
|
|
show global variables like "query_cache_size";
|
|
|
|
|
select * from t1;
|
|
|
|
|
set GLOBAL query_cache_size=40960;
|
|
|
|
|
show global variables like "query_cache_size";
|
|
|
|
|
select * from t1;
|
|
|
|
|
set GLOBAL query_cache_size=51200;
|
2002-07-28 21:36:34 +02:00
|
|
|
|
show global variables like "query_cache_size";
|
2003-05-31 00:41:11 +02:00
|
|
|
|
select * from t1;
|
|
|
|
|
set GLOBAL query_cache_size=61440;
|
|
|
|
|
show global variables like "query_cache_size";
|
|
|
|
|
select * from t1;
|
|
|
|
|
set GLOBAL query_cache_size=81920;
|
|
|
|
|
show global variables like "query_cache_size";
|
|
|
|
|
select * from t1;
|
|
|
|
|
set GLOBAL query_cache_size=102400;
|
|
|
|
|
show global variables like "query_cache_size";
|
|
|
|
|
select * from t1;
|
|
|
|
|
drop table t1;
|
2002-08-07 14:29:49 +02:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Temporary tables
|
|
|
|
|
#
|
|
|
|
|
set GLOBAL query_cache_size=1048576;
|
|
|
|
|
create table t1 (i int not null);
|
|
|
|
|
create table t2 (i int not null);
|
|
|
|
|
select * from t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
create temporary table t3 (i int not null);
|
|
|
|
|
select * from t2;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
select * from t3;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2002-12-28 20:34:17 +01:00
|
|
|
|
update t1 set i=(select distinct 1 from (select * from t2) a);
|
2002-08-07 14:29:49 +02:00
|
|
|
|
drop table t1, t2, t3;
|
2002-10-07 23:26:15 +02:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# system databse test
|
|
|
|
|
#
|
|
|
|
|
use mysql;
|
|
|
|
|
disable_result_log;
|
|
|
|
|
select * from db;
|
|
|
|
|
enable_result_log;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
use test;
|
|
|
|
|
disable_result_log;
|
|
|
|
|
select * from mysql.db;
|
|
|
|
|
enable_result_log;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2003-01-24 00:54:39 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# simple rename test
|
|
|
|
|
#
|
|
|
|
|
create table t1(id int auto_increment primary key);
|
|
|
|
|
insert into t1 values (NULL), (NULL), (NULL);
|
|
|
|
|
select * from t1 where id=2;
|
|
|
|
|
alter table t1 rename to t2;
|
|
|
|
|
-- error 1146
|
|
|
|
|
select * from t1 where id=2;
|
|
|
|
|
drop table t2;
|
|
|
|
|
-- error 1146
|
|
|
|
|
select * from t1 where id=2;
|
2003-02-14 21:20:38 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Load data invalidation test
|
|
|
|
|
#
|
|
|
|
|
create table t1 (word char(20) not null);
|
|
|
|
|
select * from t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2004-02-09 12:31:03 +01:00
|
|
|
|
--replace_result $MYSQL_TEST_DIR TEST_DIR
|
|
|
|
|
eval load data infile '$MYSQL_TEST_DIR/std_data/words.dat' into table t1;
|
2003-02-14 21:20:38 +01:00
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2004-02-09 12:31:03 +01:00
|
|
|
|
select count(*) from t1;
|
2003-03-06 16:37:12 +01:00
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# INTO OUTFILE/DUMPFILE test
|
|
|
|
|
#
|
|
|
|
|
create table t1 (a int);
|
|
|
|
|
insert into t1 values (1),(2),(3);
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2004-02-09 12:31:03 +01:00
|
|
|
|
select * from t1 into outfile "query_cache.out.file";
|
|
|
|
|
--error 1086
|
|
|
|
|
select * from t1 into outfile "query_cache.out.file";
|
2003-03-06 16:37:12 +01:00
|
|
|
|
select * from t1 limit 1 into dumpfile "query_cache.dump.file";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2003-03-27 13:15:42 +01:00
|
|
|
|
drop table t1;
|
2003-03-31 08:49:09 +02:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# test of SQL_SELECT_LIMIT
|
|
|
|
|
#
|
|
|
|
|
create table t1 (a int);
|
|
|
|
|
insert into t1 values (1),(2);
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
select * from t1;
|
|
|
|
|
SET OPTION SQL_SELECT_LIMIT=1;
|
|
|
|
|
select * from t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
SET OPTION SQL_SELECT_LIMIT=DEFAULT;
|
|
|
|
|
drop table t1;
|
2003-10-08 07:18:38 +02:00
|
|
|
|
|
2003-09-15 14:16:13 +02:00
|
|
|
|
#
|
|
|
|
|
# query cache crash on using same table twice in one query test
|
|
|
|
|
#
|
|
|
|
|
flush query cache;
|
|
|
|
|
reset query cache;
|
|
|
|
|
flush status;
|
|
|
|
|
set GLOBAL query_cache_size=1048576;
|
|
|
|
|
|
|
|
|
|
create table t1 (a int not null);
|
|
|
|
|
insert into t1 values (1),(2),(3);
|
|
|
|
|
create table t2 (a text not null);
|
|
|
|
|
create table t3 (a text not null);
|
|
|
|
|
insert into t3 values("1111111111111111111111111111111111111111111111111111");
|
|
|
|
|
insert into t2 select * from t3;
|
|
|
|
|
insert into t3 select * from t2;
|
|
|
|
|
insert into t2 select * from t3;
|
|
|
|
|
insert into t3 select * from t2;
|
|
|
|
|
insert into t2 select * from t3;
|
|
|
|
|
insert into t3 select * from t2;
|
|
|
|
|
insert into t2 select * from t3;
|
|
|
|
|
insert into t3 select * from t2;
|
|
|
|
|
insert into t2 select * from t3;
|
|
|
|
|
insert into t3 select * from t2;
|
|
|
|
|
drop table t2;
|
|
|
|
|
create table t2 (a int not null);
|
|
|
|
|
insert into t2 values (1),(2),(3);
|
|
|
|
|
create table t4 (a int not null);
|
|
|
|
|
insert into t4 values (1),(2),(3);
|
|
|
|
|
|
|
|
|
|
disable_result_log;
|
|
|
|
|
select * from t4;
|
|
|
|
|
select * from t2;
|
|
|
|
|
select * from t1 as tt, t1 as ttt where tt.a=1 and ttt.a=2;
|
|
|
|
|
select * from t2;
|
|
|
|
|
select * from t4;
|
|
|
|
|
select * from t1 as tt, t1 as ttt where tt.a=1 and ttt.a=2;
|
|
|
|
|
select * from t2;
|
|
|
|
|
select * from t4;
|
|
|
|
|
select * from t1 as tt, t1 as ttt where tt.a=1 and ttt.a=2;
|
|
|
|
|
|
|
|
|
|
delete from t2 where a=1;
|
|
|
|
|
flush query cache;
|
|
|
|
|
select * from t3;
|
|
|
|
|
enable_result_log;
|
|
|
|
|
delete from t4 where a=1;
|
|
|
|
|
flush query cache;
|
|
|
|
|
drop table t1,t2,t3,t4;
|
2003-11-04 08:40:36 +01:00
|
|
|
|
|
2004-03-04 17:32:55 +01:00
|
|
|
|
#
|
|
|
|
|
# WRITE LOCK & QC
|
|
|
|
|
#
|
|
|
|
|
set query_cache_wlock_invalidate=1;
|
|
|
|
|
create table t1 (a int not null);
|
|
|
|
|
create table t2 (a int not null);
|
|
|
|
|
select * from t1;
|
|
|
|
|
select * from t2;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
lock table t1 write, t2 read;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
unlock table;
|
|
|
|
|
drop table t1,t2;
|
|
|
|
|
set query_cache_wlock_invalidate=default;
|
|
|
|
|
|
2004-10-21 22:56:12 +02:00
|
|
|
|
#
|
|
|
|
|
# hiding real table stored in query cache by temporary table
|
|
|
|
|
#
|
|
|
|
|
CREATE TABLE t1 (id INT PRIMARY KEY);
|
|
|
|
|
insert into t1 values (1),(2),(3);
|
|
|
|
|
select * from t1;
|
|
|
|
|
create temporary table t1 (a int not null auto_increment
|
|
|
|
|
primary key);
|
|
|
|
|
select * from t1;
|
|
|
|
|
drop table t1;
|
|
|
|
|
drop table t1;
|
2004-03-16 21:41:30 +01:00
|
|
|
|
|
2003-10-08 07:18:38 +02:00
|
|
|
|
#
|
|
|
|
|
# Test character set related variables:
|
|
|
|
|
# character_set_result
|
|
|
|
|
# character_set_client
|
|
|
|
|
# charactet_set_connection/collation_connection
|
|
|
|
|
# If at least one of the above variables has changed,
|
|
|
|
|
# the cached query can't be reused. In the below test
|
|
|
|
|
# absolutely the same query is used several times,
|
|
|
|
|
# SELECT should fetch different results for every instance.
|
|
|
|
|
# No hits should be produced.
|
|
|
|
|
# New cache entry should appear for every SELECT.
|
|
|
|
|
#
|
|
|
|
|
SET NAMES koi8r;
|
|
|
|
|
CREATE TABLE t1 (a char(1) character set koi8r);
|
|
|
|
|
INSERT INTO t1 VALUES (_koi8r'<27>'),(_koi8r'<27>');
|
|
|
|
|
#
|
|
|
|
|
# Run select
|
|
|
|
|
#
|
|
|
|
|
SELECT a,'<27>','<27>'='<27>' FROM t1;
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
#
|
|
|
|
|
# Change collation_connection and run the same query again
|
|
|
|
|
#
|
|
|
|
|
set collation_connection=koi8r_bin;
|
|
|
|
|
SELECT a,'<27>','<27>'='<27>' FROM t1;
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
#
|
|
|
|
|
# Now change character_set_client and run the same query again
|
|
|
|
|
#
|
|
|
|
|
set character_set_client=cp1251;
|
|
|
|
|
SELECT a,'<27>','<27>'='<27>' FROM t1;
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
#
|
|
|
|
|
# And finally change character_set_results and run the same query again
|
|
|
|
|
#
|
|
|
|
|
set character_set_results=cp1251;
|
|
|
|
|
SELECT a,'<27>','<27>'='<27>' FROM t1;
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
2005-07-23 06:51:25 +02:00
|
|
|
|
SET NAMES default;
|
2003-10-22 16:10:22 +02:00
|
|
|
|
|
2003-10-08 07:18:38 +02:00
|
|
|
|
DROP TABLE t1;
|
2003-12-04 22:57:10 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# DROP current database test
|
2003-07-30 13:59:56 +02:00
|
|
|
|
#
|
2003-12-04 22:57:10 +01:00
|
|
|
|
CREATE TABLE t1 (a int(1));
|
|
|
|
|
CREATE DATABASE mysqltest;
|
|
|
|
|
USE mysqltest;
|
|
|
|
|
DROP DATABASE mysqltest;
|
|
|
|
|
SELECT * FROM test.t1;
|
|
|
|
|
USE test;
|
|
|
|
|
DROP TABLE t1;
|
|
|
|
|
|
2004-03-30 22:38:56 +02:00
|
|
|
|
#
|
|
|
|
|
# charset with NULL
|
|
|
|
|
#
|
|
|
|
|
set character_set_results=null;
|
|
|
|
|
select @@character_set_results;
|
|
|
|
|
set character_set_results=default;
|
2004-09-10 15:28:18 +02:00
|
|
|
|
#
|
|
|
|
|
# query cache and environment variables
|
|
|
|
|
#
|
|
|
|
|
# max_sort_length
|
|
|
|
|
set GLOBAL query_cache_size=1355776;
|
|
|
|
|
create table t1 (id int auto_increment primary key, c char(25));
|
|
|
|
|
insert into t1 set c = repeat('x',24);
|
|
|
|
|
insert into t1 set c = concat(repeat('x',24),'x');
|
|
|
|
|
insert into t1 set c = concat(repeat('x',24),'w');
|
|
|
|
|
insert into t1 set c = concat(repeat('x',24),'y');
|
|
|
|
|
set max_sort_length=200;
|
|
|
|
|
select c from t1 order by c, id;
|
|
|
|
|
reset query cache;
|
|
|
|
|
set max_sort_length=20;
|
|
|
|
|
select c from t1 order by c, id;
|
|
|
|
|
set max_sort_length=200;
|
|
|
|
|
select c from t1 order by c, id;
|
|
|
|
|
set max_sort_length=default;
|
|
|
|
|
# sql_mode
|
|
|
|
|
select '1' || '3' from t1;
|
|
|
|
|
set SQL_MODE=oracle;
|
|
|
|
|
select '1' || '3' from t1;
|
|
|
|
|
set SQL_MODE=default;
|
|
|
|
|
drop table t1;
|
|
|
|
|
# group_concat_max_len
|
|
|
|
|
create table t1 (a varchar(20), b int);
|
|
|
|
|
insert into t1 values ('12345678901234567890', 1);
|
|
|
|
|
set group_concat_max_len=10;
|
|
|
|
|
select group_concat(a) FROM t1 group by b;
|
|
|
|
|
set group_concat_max_len=1024;
|
|
|
|
|
select group_concat(a) FROM t1 group by b;
|
|
|
|
|
set group_concat_max_len=default;
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
2003-07-18 15:34:50 +02:00
|
|
|
|
# comments before command
|
|
|
|
|
#
|
|
|
|
|
create table t1 (a int);
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
show status like "Qcache_inserts";
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
/**/ select * from t1;
|
|
|
|
|
/**/ select * from t1;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
show status like "Qcache_inserts";
|
|
|
|
|
show status like "Qcache_hits";
|
2003-11-19 15:19:46 +01:00
|
|
|
|
|
2003-10-08 07:18:38 +02:00
|
|
|
|
#
|
|
|
|
|
# Keep things tidy
|
|
|
|
|
#
|
|
|
|
|
DROP TABLE t1;
|
2003-11-04 08:40:36 +01:00
|
|
|
|
SET GLOBAL query_cache_size=0;
|
wl#1629 SHOW with WHERE(final part, after review)
added syntax:
'show variables where', 'show status where', 'show open tables where'
mysql-test/r/grant_cache.result:
wl#1629 SHOW with WHERE(final part,after review)
mysql-test/r/information_schema.result:
wl#1629 SHOW with WHERE(final part,after review)
mysql-test/r/query_cache.result:
wl#1629 SHOW with WHERE(final part,after review)
mysql-test/r/temp_table.result:
wl#1629 SHOW with WHERE(final part,after review)
mysql-test/r/union.result:
wl#1629 SHOW with WHERE(final part,after review)
mysql-test/t/information_schema.test:
wl#1629 SHOW with WHERE(final part,after review)
mysql-test/t/query_cache.test:
wl#1629 SHOW with WHERE(final part,after review)
sql/item.cc:
wl#1629 SHOW with WHERE(final part,after review)
sql/mysql_priv.h:
wl#1629 SHOW with WHERE(final part,after review)
sql/sql_parse.cc:
wl#1629 SHOW with WHERE(final part,after review)
sql/sql_select.cc:
wl#1629 SHOW with WHERE(final part,after review)
sql/sql_show.cc:
wl#1629 SHOW with WHERE(final part,after review)
sql/sql_yacc.yy:
wl#1629 SHOW with WHERE(final part,after review)
sql/table.h:
wl#1629 SHOW with WHERE(final part,after review)
2004-12-30 13:20:40 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Information schema & query cache test
|
|
|
|
|
#
|
|
|
|
|
SET SESSION query_cache_type = 2;
|
|
|
|
|
create table t1(a int);
|
|
|
|
|
select table_name from information_schema.tables
|
|
|
|
|
where table_schema="test";
|
|
|
|
|
drop table t1;
|
|
|
|
|
select table_name from information_schema.tables
|
|
|
|
|
where table_schema="test";
|
2005-03-08 03:15:19 +01:00
|
|
|
|
# Bug #8480: REPAIR TABLE needs to flush the table from the query cache
|
2005-03-12 00:06:03 +01:00
|
|
|
|
SET SESSION query_cache_type = 1;
|
2005-03-08 03:15:19 +01:00
|
|
|
|
set global query_cache_size=1024*1024;
|
|
|
|
|
flush query cache;
|
|
|
|
|
create table t1 ( a int );
|
|
|
|
|
insert into t1 values (1);
|
|
|
|
|
select a from t1;
|
|
|
|
|
select a from t1;
|
|
|
|
|
show status like 'qcache_queries_in_cache';
|
|
|
|
|
repair table t1;
|
|
|
|
|
show status like 'qcache_queries_in_cache';
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
2005-07-23 06:51:25 +02:00
|
|
|
|
#
|
2005-04-01 05:17:45 +02:00
|
|
|
|
# Bug #9549: Make sure cached queries that span more than one cache block
|
|
|
|
|
# are handled properly in the embedded server.
|
2005-07-23 06:51:25 +02:00
|
|
|
|
#
|
2005-04-01 05:17:45 +02:00
|
|
|
|
# We just want a small query cache, so we can fragment it easily
|
|
|
|
|
set GLOBAL query_cache_size=64*1024;
|
|
|
|
|
# This actually gives us a usable cache size of about 48K
|
|
|
|
|
|
|
|
|
|
# Each table is about 14K
|
|
|
|
|
create table t1 (a text);
|
|
|
|
|
insert into t1 values (repeat('abcdefghijklmnopqrstuvwxyz', 550));
|
|
|
|
|
create table t2 (a text);
|
|
|
|
|
insert into t2 values (repeat('ijklmnopqrstuvwxyzabcdefgh', 550));
|
|
|
|
|
|
|
|
|
|
# Load a query from each table into the query cache
|
|
|
|
|
--disable_result_log
|
|
|
|
|
select a from t1; # Q1
|
|
|
|
|
select a from t2; # Q2
|
|
|
|
|
--enable_result_log
|
|
|
|
|
show status like 'Qcache_%_blocks';
|
|
|
|
|
|
|
|
|
|
# Now the cache looks like (14K for Q1)(14K for Q2)(20K free)
|
|
|
|
|
|
|
|
|
|
# Flush Q1 from the cache by adding an out-of-order chunk to t1
|
|
|
|
|
insert into t1 select reverse(a) from t1;
|
|
|
|
|
show status like 'Qcache_%_blocks';
|
|
|
|
|
|
|
|
|
|
# Now the cache looks like (14K free)(14K for Q2)(20K free)
|
|
|
|
|
|
|
|
|
|
# Load our new data into the query cache
|
|
|
|
|
--disable_result_log
|
|
|
|
|
select a from t1; # Q3
|
|
|
|
|
--enable_result_log
|
|
|
|
|
show status like 'Qcache_%_blocks';
|
|
|
|
|
|
|
|
|
|
# Now the cache should be like (14K for Q3)(14K for Q2)(14K for Q3)(6K free)
|
|
|
|
|
|
|
|
|
|
# Note that Q3 is split across two chunks!
|
|
|
|
|
|
|
|
|
|
# Load Q3 from the cache, and actually pay attention to the results
|
|
|
|
|
select a from t1;
|
|
|
|
|
|
|
|
|
|
flush query cache;
|
|
|
|
|
|
|
|
|
|
drop table t1, t2;
|
2005-07-23 06:51:25 +02:00
|
|
|
|
set GLOBAL query_cache_size=1355776
|
|
|
|
|
|
2005-04-01 05:17:45 +02:00
|
|
|
|
|
2005-06-27 23:52:21 +02:00
|
|
|
|
#
|
|
|
|
|
# Query with warning prohibited to query cache (BUG#9414)
|
|
|
|
|
#
|
|
|
|
|
flush status;
|
|
|
|
|
CREATE TABLE t1 (
|
|
|
|
|
`date` datetime NOT NULL default '0000-00-00 00:00:00',
|
|
|
|
|
KEY `date` (`date`)
|
|
|
|
|
) ENGINE=MyISAM;
|
|
|
|
|
|
|
|
|
|
INSERT INTO t1 VALUES ('20050326');
|
|
|
|
|
INSERT INTO t1 VALUES ('20050325');
|
2005-08-04 21:45:32 +02:00
|
|
|
|
SELECT COUNT(*) FROM t1 WHERE date BETWEEN '20050326' AND '20050327 invalid';
|
|
|
|
|
SELECT COUNT(*) FROM t1 WHERE date BETWEEN '20050326' AND '20050328 invalid';
|
|
|
|
|
SELECT COUNT(*) FROM t1 WHERE date BETWEEN '20050326' AND '20050327 invalid';
|
2005-06-27 23:52:21 +02:00
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
show status like "Qcache_inserts";
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
2005-06-23 19:06:35 +02:00
|
|
|
|
#
|
|
|
|
|
# queries with subquery in the FROM clause (BUG#11522)
|
|
|
|
|
#
|
2005-07-04 00:36:06 +02:00
|
|
|
|
create table t1 (a int);
|
|
|
|
|
insert into t1 values (1);
|
|
|
|
|
reset query cache;
|
|
|
|
|
flush status;
|
2005-06-23 19:06:35 +02:00
|
|
|
|
select * from (select * from t1) a;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
show status like "Qcache_inserts";
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
select * from (select * from t1) a;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
show status like "Qcache_inserts";
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
insert into t1 values (2);
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
show status like "Qcache_inserts";
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
select * from (select * from t1) a;
|
|
|
|
|
show status like "Qcache_queries_in_cache";
|
|
|
|
|
show status like "Qcache_inserts";
|
|
|
|
|
show status like "Qcache_hits";
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
2005-06-14 21:45:48 +02:00
|
|
|
|
#
|
2005-12-01 13:26:19 +01:00
|
|
|
|
# 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;
|
2005-06-14 21:45:48 +02:00
|
|
|
|
# SP cursors and selects with query cache (BUG#9715)
|
|
|
|
|
#
|
|
|
|
|
create table t1 (a int);
|
|
|
|
|
insert into t1 values (1),(2);
|
|
|
|
|
|
|
|
|
|
delimiter //;
|
|
|
|
|
CREATE PROCEDURE `p1`()
|
|
|
|
|
begin
|
|
|
|
|
Declare c1 cursor for select a from t1;
|
|
|
|
|
open c1;
|
|
|
|
|
select * from t1;
|
|
|
|
|
end//
|
|
|
|
|
call p1()//
|
|
|
|
|
drop procedure p1;
|
|
|
|
|
|
|
|
|
|
create function f1() returns int
|
|
|
|
|
begin
|
|
|
|
|
Declare var1 int;
|
|
|
|
|
select max(a) from t1 into var1;
|
|
|
|
|
return var1;
|
|
|
|
|
end//
|
|
|
|
|
create procedure `p1`()
|
|
|
|
|
begin
|
|
|
|
|
select a, f1() from t1;
|
|
|
|
|
end//
|
|
|
|
|
call p1()//
|
|
|
|
|
drop procedure p1//
|
Add new option "check-testcases" to mysql-test-run.pl
Cleanup the sideeffects from most of the testcases with sideeffects.
mysql-test/mysql-test-run.pl:
Add option "check-testcases" to mysql-test-run.pl
Will execute "include/check-testcase.test" once before each tescase and record the output into "var/tmp/check-testcase.result"
After the teastcase it will run again and this time compare the output with previously recorded file.
mysql-test/r/analyze.result:
Drop table t1 at end of test
mysql-test/r/create_select_tmp.result:
Drop table t1 at end of test
mysql-test/r/ctype_cp932.result:
Drop table t1 at end of test
mysql-test/r/ctype_recoding.result:
Drop table t1 at end of test
mysql-test/r/grant2.result:
Drop user mysqltest_2 and mysqltest_A@'%'
mysql-test/r/join_outer.result:
Drop view v1 to cleanup
mysql-test/r/ps_1general.result:
Drop table t1 at end of test
mysql-test/r/query_cache.result:
Drop function "f1"
mysql-test/r/read_only.result:
Reset the "read_only" flag
mysql-test/r/rpl000001.result:
Remove user "blafasel2"
mysql-test/r/rpl000017.result:
Remove user "replicate"
mysql-test/r/rpl_failed_optimize.result:
Drop table t1 to cleanup
mysql-test/r/rpl_flush_tables.result:
Drop tables t3, t4, t5
mysql-test/r/rpl_ignore_revoke.result:
Delete user "user_foo"
mysql-test/r/rpl_insert_id.result:
Drop table t1 to cleanup
mysql-test/r/rpl_loaddata.result:
Drop tyable t1 to cleanup
mysql-test/r/rpl_loaddata_rule_m.result:
Drop tyable t1 to cleanup
mysql-test/r/rpl_loaddata_rule_s.result:
Drop tyable t1 to cleanup
mysql-test/r/rpl_misc_functions.result:
Drop tyable t1 to cleanup
mysql-test/r/rpl_multi_update3.result:
Drop tyable t1 and t2 to cleanup
mysql-test/r/rpl_replicate_do.result:
Drop tyable t1 to cleanup
mysql-test/r/rpl_skip_error.result:
Drop tyable t1 to cleanup
mysql-test/r/rpl_slave_status.result:
Drop tyable t1 to cleanup
mysql-test/r/sp-prelocking.result:
Drop view v1 and tables t1, t2, t3 and t4 to cleanup
mysql-test/r/sp-security.result:
Delete users to cleanup
Delete remaining traces in tables_priv and procs_priv
mysql-test/r/subselect_innodb.result:
Drop procedure p1 to cleanup
mysql-test/r/trigger-compat.result:
Drop trigger wl2818_trg1 and wl2818_trg2.
Drop table t1, t2
Drop database mysqltest_db1
And the users "mysqltest_dfn@localhost" and "mysqltest_inv@localhost"
mysql-test/r/type_bit.result:
Drop tables t1 and t2 to cleanup
mysql-test/r/variables.result:
Set GLOBAL max_join_size to 10 as it originally was in variables-master.opt
mysql-test/r/view_grant.result:
Dop user "test@localhost" to cleanup
mysql-test/t/analyze.test:
Drop table t1 to cleanup
mysql-test/t/create_select_tmp.test:
Drop table t1 to cleanup
mysql-test/t/ctype_cp932.test:
Drop table t1 to cleanup
mysql-test/t/ctype_recoding.test:
Drop table t1 to cleanup
mysql-test/t/fulltext_var.test:
Restore the original ft_boolean_syntax
mysql-test/t/grant2.test:
Drop users "mysqltest_2" and "mysqltest_A@'%'" to cleanup
mysql-test/t/innodb_cache.test:
Reset query_cache_size to original value
mysql-test/t/join_outer.test:
Drop view v1 to cleanup
mysql-test/t/ps_1general.test:
Drop table t1 to cleanup
mysql-test/t/query_cache.test:
Drop function "f1" to cleanup
mysql-test/t/read_only.test:
Reset the readonly flag
mysql-test/t/rpl000001.test:
Delete user "blafasel2" to cleanup
mysql-test/t/rpl000017.test:
Delete user "replicate" to cleanup
mysql-test/t/rpl_failed_optimize.test:
Drop table t1 to cleanup
mysql-test/t/rpl_flush_tables.test:
Droip table t3, t4 and t5 to cleanup
mysql-test/t/rpl_ignore_revoke.test:
Delet user "user_foo" to cleanup
mysql-test/t/rpl_insert_id.test:
drop table t1 to cleanup
mysql-test/t/rpl_loaddata.test:
Drop table t1 to cleanup
mysql-test/t/rpl_loaddata_rule_m.test:
Drop table t1 to cleanup
mysql-test/t/rpl_loaddata_rule_s.test:
Drop table t1 to cleanup
mysql-test/t/rpl_misc_functions.test:
Drop table t1 to cleanup
mysql-test/t/rpl_multi_update3.test:
Drop table t1 and t2 to cleanup
mysql-test/t/rpl_replicate_do.test:
Drop table t1 to cleanup
mysql-test/t/rpl_skip_error.test:
Drop table t1 to cleanup
mysql-test/t/rpl_slave_status.test:
Drop table t1 to cleanup
mysql-test/t/sp-prelocking.test:
Drop table t1, t2 t3 and t4 to cleanup
Drop view v1
mysql-test/t/sp-security.test:
Delete test users from mysql.user, mysql.db, mysql.procs_priv and mysql.tables_priv
Drop table t1 to cleanup
mysql-test/t/subselect_innodb.test:
Drop procedure p1 to cleanup
mysql-test/t/trigger-compat.test:
Drop trigger wl2818_trg1 and wl2818_trg2 to cleanup
Drop table t1, t2
Drop users
drop database mysqltest_db1
mysql-test/t/type_bit.test:
drop table t1 and t2 to cleanup
mysql-test/t/variables-master.opt:
Increase max_join_size to 100.
mysql-test/t/variables.test:
Set max_join_size to 10, which was the original value in variables-master.opt
mysql-test/t/view_grant.test:
Drop the user "test@localhost"
mysql-test/include/check-testcase.test:
New BitKeeper file ``mysql-test/include/check-testcase.test''
2006-01-26 17:54:34 +01:00
|
|
|
|
drop function f1//
|
2005-06-14 21:45:48 +02:00
|
|
|
|
|
|
|
|
|
drop table t1//
|
|
|
|
|
delimiter ;//
|
|
|
|
|
|
2005-07-23 06:51:25 +02:00
|
|
|
|
#
|
|
|
|
|
# query in QC from normal execution and SP (BUG#6897)
|
2005-09-29 10:25:44 +02:00
|
|
|
|
# improved to also test BUG#3583 and BUG#12990
|
2005-07-23 06:51:25 +02:00
|
|
|
|
#
|
|
|
|
|
flush query cache;
|
|
|
|
|
reset query cache;
|
|
|
|
|
flush status;
|
|
|
|
|
delimiter //;
|
|
|
|
|
create table t1 (s1 int)//
|
|
|
|
|
create procedure f1 () begin
|
|
|
|
|
select sql_cache * from t1;
|
|
|
|
|
select sql_cache * from t1;
|
2005-09-29 10:25:44 +02:00
|
|
|
|
select sql_cache * from t1;
|
|
|
|
|
end;//
|
|
|
|
|
create procedure f2 () begin
|
|
|
|
|
select sql_cache * from t1 where s1=1;
|
|
|
|
|
select sql_cache * from t1;
|
|
|
|
|
end;//
|
|
|
|
|
create procedure f3 () begin
|
|
|
|
|
select sql_cache * from t1;
|
|
|
|
|
select sql_cache * from t1 where s1=1;
|
|
|
|
|
end;//
|
|
|
|
|
create procedure f4 () begin
|
|
|
|
|
select sql_cache * from t1;
|
|
|
|
|
select sql_cache * from t1 where s1=1;
|
|
|
|
|
select sql_cache * from t1;
|
|
|
|
|
select sql_cache * from t1 where s1=1;
|
|
|
|
|
select sql_cache * from t1 where s1=1;
|
2005-07-23 06:51:25 +02:00
|
|
|
|
end;//
|
|
|
|
|
delimiter ;//
|
|
|
|
|
call f1();
|
|
|
|
|
call f1();
|
|
|
|
|
call f1();
|
|
|
|
|
select sql_cache * from t1;
|
|
|
|
|
insert into t1 values (1);
|
|
|
|
|
select sql_cache * from t1;
|
|
|
|
|
call f1();
|
|
|
|
|
call f1();
|
|
|
|
|
select sql_cache * from t1;
|
2005-09-29 10:25:44 +02:00
|
|
|
|
flush query cache;
|
|
|
|
|
reset query cache;
|
|
|
|
|
flush status;
|
|
|
|
|
select sql_cache * from t1;
|
|
|
|
|
select sql_cache * from t1 where s1=1;
|
|
|
|
|
call f1();
|
|
|
|
|
call f2();
|
|
|
|
|
call f3();
|
|
|
|
|
call f4();
|
|
|
|
|
call f4();
|
|
|
|
|
call f3();
|
|
|
|
|
call f2();
|
|
|
|
|
select sql_cache * from t1 where s1=1;
|
|
|
|
|
insert into t1 values (2);
|
|
|
|
|
call f1();
|
|
|
|
|
select sql_cache * from t1 where s1=1;
|
|
|
|
|
select sql_cache * from t1;
|
|
|
|
|
call f1();
|
|
|
|
|
call f3();
|
|
|
|
|
call f3();
|
|
|
|
|
call f1();
|
|
|
|
|
|
2005-07-23 06:51:25 +02:00
|
|
|
|
drop procedure f1;
|
2005-09-29 10:25:44 +02:00
|
|
|
|
drop procedure f2;
|
|
|
|
|
drop procedure f3;
|
|
|
|
|
drop procedure f4;
|
2005-07-23 06:51:25 +02:00
|
|
|
|
drop table t1;
|
2003-09-15 14:16:13 +02:00
|
|
|
|
set GLOBAL query_cache_size=0;
|
2005-07-28 02:22:47 +02:00
|
|
|
|
|
|
|
|
|
# End of 4.1 tests
|
2005-09-06 12:00:35 +02:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Bug #10303: problem with last_query_cost
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
SET GLOBAL query_cache_size=102400;
|
|
|
|
|
create table t1(a int);
|
|
|
|
|
insert into t1 values(0), (1), (4), (5);
|
|
|
|
|
select * from t1 where a > 3;
|
|
|
|
|
select * from t1 where a > 3;
|
|
|
|
|
show status like 'last_query_cost';
|
|
|
|
|
drop table t1;
|
|
|
|
|
SET GLOBAL query_cache_size=0;
|