mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 23:04:20 +01:00
1fc7f2117b
"Server Variables for Plugins" Implement support for plugins to declare server variables. Demonstrate functionality by removing InnoDB specific code from sql/* New feature for HASH - HASH_UNIQUE flag New feature for DYNAMIC_ARRAY - initializer accepts preallocated ptr. Completed support for plugin reference counting. include/hash.h: New flag for HASH HASH_UNIQUE include/my_getopt.h: New data types for options: ENUM and SET. Use typelib to enumerate possible values. New flag variable: my_getopt_skip_unknown include/my_sys.h: change to DYNAMIC_ARRAY init functions to support pre-allocated buffers include/mysql.h: relocate inclusion of typelib due to longlong requirement include/mysql/plugin.h: wl2936 New declarations for plugin server variable support. New functions for use by plugins include/mysys_err.h: new my_getopt return value: EXIT_ARGUMENT_INVALID include/typelib.h: new typelib function: find_typeset(), returns an int which is a SET of the elements in the typelib mysql-test/r/im_utils.result: change to more specific command line settings --skip-innodb => --skip-plugin-innodb etc. mysql-test/r/log_tables.result: set default storage engine to MEMORY so that test will succeed even when some of the other named storage engines are not present mysql-test/r/ndb_dd_basic.result: change in error message mysql-test/r/partition_innodb.result: change in results mysql-test/r/ps_1general.result: bdb doesn't exist, use myisam for a non-transactional engine mysql-test/r/variables.result: information schema doesn't sort row results for server variables. mysql-test/t/log_tables.test: set default storage engine to MEMORY so that test will succeed even when some of the other named storage engines are not present mysql-test/t/ndb_dd_basic.test: ALTER LOGFILE GROUP no longer silently fail here mysql-test/t/partition_innodb.test: ALTER TABLE no longer silently fails for unknown storage engine mysql-test/t/ps_1general.test: remove unneccessary parts use myisam as it is an always present non-transactional engine mysql-test/t/variables.test: information schema doesn't sort row results for server variables. mysql-test/t/warnings_engine_disabled-master.opt: use the new style command line option mysys/array.c: change to DYNAMIC_ARRAY init functions to support pre-allocated buffers mysys/hash.c: New flag for HASH HASH_UNIQUE Implement HASH_UNIQUE functionality by performing a hash_search mysys/my_getopt.c: New data types for options: ENUM and SET. Use typelib to enumerate possible values. New flag variable: my_getopt_skip_unknown mysys/typelib.c: new typelib function: find_typeset(), returns an int which is a SET of the elements in the typelib sql/ha_ndbcluster.cc: use ha_statistic_increment() method instead of statistic_increment() function ha_ndbcluster variable has gone away. sql/ha_partition.cc: fix for reference counting sql/ha_partition.h: fix for reference counting sql/handler.cc: fixes for reference counting sql/handler.h: fixes for reference counting some new methods to aid storage engine writers sql/item_func.cc: find_sys_var() function now requires thd sql/item_sum.cc: fixes for ref counting sql/mysql_priv.h: remove unneccessary globals. new lock: LOCK_system_variables_hash sql/mysqld.cc: Remove InnoBase specific code. Support plugin command line processing. sql/set_var.cc: Remove InnoBase specific declarations Remove redundant declarations changes to permit new variables at run time changes for ref counting sql/set_var.h: changes to permit new variables at run time changes for ref counting sql/sql_base.cc: changes for ref counting sql/sql_cache.cc: mark code as needing work in the future sql/sql_class.cc: new functions to aid plugin authors initialize variables for dynamic plugin variables sql/sql_class.h: remove InnoBase specific declarations New declarations for plugin variables. sql/sql_connect.cc: initialization and cleanup of plugin variables sql/sql_delete.cc: change for ref counting sql/sql_insert.cc: change for ref counting sql/sql_lex.cc: changes for ref counting and plugin variables sql/sql_lex.h: add properties for plugin ref counting, add to distructor to clean up sql/sql_partition.cc: changes for ref counting sql/sql_plugin.cc: WL2936 Plugin Variables New methods and code to support server variables for plugins. New code to complete plugin reference counting Debug code adds further indirection so that malloc debugging can be used to aid finding plugin ref count leaks sql/sql_plugin.h: WL2936 Plugin Variables New methods and code to support server variables for plugins. New code to complete plugin reference counting Debug code adds further indirection so that malloc debugging can be used to aid finding plugin ref count leaks sql/sql_repl.cc: replication system variables moved here from set_var.cc sql/sql_repl.h: new function to initialise replication server variables sql/sql_select.cc: changes for ref counting sql/sql_show.cc: changes for ref counting sql/sql_table.cc: changes for ref counting sql/sql_tablespace.cc: use supplied functions instead of digging into data structures manually sql/sql_yacc.yy: changes for ref counting find_sys_var() now requires thd parameter changes on reporting errors to keep user-visible behaviour the same. sql/structs.h: changes for ref counting sql/table.cc: changes for ref counting sql/table.h: changes for ref counting storage/federated/ha_federated.cc: use ha_statistic_increment() method instead of statistic_increment() function storage/heap/ha_heap.cc: use ha_statistic_increment() method instead of statistic_increment() function storage/innobase/handler/ha_innodb.cc: use ha_statistic_increment() method instead of statistic_increment() function WL2936 Move InnoBase specific code out of mysqld.cc and into here Declare all required server variables for InnoBase storage/innobase/include/trx0trx.h: store a bit more state so that InnoBase does not have to dig into mysqld internal data structures. storage/myisam/ha_myisam.cc: use ha_statistic_increment() method instead of statistic_increment() function storage/myisammrg/ha_myisammrg.cc: use ha_statistic_increment() method instead of statistic_increment() function
407 lines
10 KiB
Text
407 lines
10 KiB
Text
# this test needs multithreaded mysqltest
|
|
-- source include/not_embedded.inc
|
|
#
|
|
# Basic log tables test
|
|
#
|
|
|
|
# check that CSV engine was compiled in
|
|
--source include/have_csv.inc
|
|
|
|
--disable_ps_protocol
|
|
use mysql;
|
|
|
|
#
|
|
# Check that log tables work and we can do basic selects. This also
|
|
# tests truncate, which works in a special mode with the log tables
|
|
#
|
|
|
|
truncate table general_log;
|
|
--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID
|
|
select * from general_log;
|
|
truncate table slow_log;
|
|
--replace_column 1 TIMESTAMP 2 USER_HOST
|
|
select * from slow_log;
|
|
|
|
#
|
|
# We want to check that a record newly written to a log table shows up for
|
|
# the query: since log tables use concurrent insert machinery and log tables
|
|
# are always locked by artificial THD, this feature requires additional
|
|
# check in ha_tina::write_row. This simple test should prove that the
|
|
# log table flag in the table handler is triggered and working.
|
|
#
|
|
|
|
truncate table general_log;
|
|
--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID
|
|
select * from general_log where argument like '%general_log%';
|
|
|
|
|
|
#
|
|
# Check some basic queries interfering with the log tables.
|
|
# In our test we'll use a tbale with verbose comments to the short
|
|
# command type names, used in the tables
|
|
#
|
|
|
|
create table join_test (verbose_comment varchar (80), command_type varchar(64));
|
|
|
|
insert into join_test values ("User performed a usual SQL query", "Query");
|
|
insert into join_test values ("New DB connection was registered", "Connect");
|
|
insert into join_test values ("Get the table info", "Field List");
|
|
|
|
--replace_column 2 USER_HOST
|
|
select verbose_comment, user_host, argument
|
|
from mysql.general_log join join_test
|
|
on (mysql.general_log.command_type = join_test.command_type);
|
|
|
|
drop table join_test;
|
|
|
|
#
|
|
# check that flush of the log table work fine
|
|
#
|
|
|
|
flush logs;
|
|
|
|
#
|
|
# check locking of the log tables
|
|
#
|
|
|
|
--error ER_CANT_WRITE_LOCK_LOG_TABLE
|
|
lock tables mysql.general_log WRITE;
|
|
|
|
--error ER_CANT_WRITE_LOCK_LOG_TABLE
|
|
lock tables mysql.slow_log WRITE;
|
|
|
|
#
|
|
# This attemts to get TL_READ_NO_INSERT lock, which is incompatible with
|
|
# TL_WRITE_CONCURRENT_INSERT. This should fail. We issue this error as log
|
|
# tables are always opened and locked by the logger.
|
|
#
|
|
|
|
--error ER_CANT_READ_LOCK_LOG_TABLE
|
|
lock tables mysql.general_log READ;
|
|
|
|
--error ER_CANT_READ_LOCK_LOG_TABLE
|
|
lock tables mysql.slow_log READ;
|
|
|
|
#
|
|
# This call should result in TL_READ lock on the log table. This is ok and
|
|
# should pass.
|
|
#
|
|
|
|
lock tables mysql.slow_log READ LOCAL, mysql.general_log READ LOCAL;
|
|
|
|
unlock tables;
|
|
|
|
#
|
|
# check that FLUSH LOGS waits for all readers of the log table to vanish
|
|
#
|
|
|
|
connect (con1,localhost,root,,);
|
|
connect (con2,localhost,root,,);
|
|
|
|
connection con1;
|
|
|
|
lock tables mysql.general_log READ LOCAL;
|
|
|
|
connection con2;
|
|
|
|
# this should wait for log tables to unlock
|
|
send flush logs;
|
|
|
|
connection con1;
|
|
|
|
unlock tables;
|
|
|
|
# this connection should be alive by the time
|
|
connection con2;
|
|
|
|
reap;
|
|
|
|
select "Mark that we woke up from flush logs in the test"
|
|
as "test passed";
|
|
|
|
#
|
|
# perform the same check for TRUNCATE: it should also wait for readers
|
|
# to disappear
|
|
#
|
|
|
|
connection con1;
|
|
|
|
lock tables mysql.general_log READ LOCAL;
|
|
|
|
connection con2;
|
|
|
|
# this should wait for log tables to unlock
|
|
send truncate mysql.general_log;
|
|
|
|
connection con1;
|
|
|
|
unlock tables;
|
|
|
|
# this connection should be alive by the time
|
|
connection con2;
|
|
|
|
reap;
|
|
|
|
select "Mark that we woke up from TRUNCATE in the test"
|
|
as "test passed";
|
|
|
|
connection con1;
|
|
|
|
use test;
|
|
|
|
#
|
|
# Bug #16905 Log tables: unicode statements are logged incorrectly
|
|
#
|
|
|
|
truncate table mysql.general_log;
|
|
set names utf8;
|
|
create table bug16905 (s char(15) character set utf8 default 'пусто');
|
|
insert into bug16905 values ('новое');
|
|
--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID
|
|
select * from mysql.general_log;
|
|
drop table bug16905;
|
|
|
|
#
|
|
# Bug #17600: Invalid data logged into mysql.slow_log
|
|
#
|
|
|
|
truncate table mysql.slow_log;
|
|
set session long_query_time=1;
|
|
select sleep(2);
|
|
--replace_column 1 TIMESTAMP 2 USER_HOST 3 QUERY_TIME
|
|
select * from mysql.slow_log;
|
|
|
|
#
|
|
# Bug #18559 log tables cannot change engine, and gets deadlocked when
|
|
# dropping w/ log on
|
|
#
|
|
|
|
# check that appropriate error messages are given when one attempts to alter
|
|
# or drop a log tables, while corresponding logs are enabled
|
|
--error ER_BAD_LOG_STATEMENT
|
|
alter table mysql.general_log engine=myisam;
|
|
--error ER_BAD_LOG_STATEMENT
|
|
alter table mysql.slow_log engine=myisam;
|
|
|
|
--error ER_BAD_LOG_STATEMENT
|
|
drop table mysql.general_log;
|
|
--error ER_BAD_LOG_STATEMENT
|
|
drop table mysql.slow_log;
|
|
|
|
# check that one can alter log tables to MyISAM
|
|
set global general_log='OFF';
|
|
|
|
# cannot convert another log table
|
|
--error ER_BAD_LOG_STATEMENT
|
|
alter table mysql.slow_log engine=myisam;
|
|
|
|
# alter both tables
|
|
set global slow_query_log='OFF';
|
|
# check that both tables use CSV engine
|
|
show create table mysql.general_log;
|
|
show create table mysql.slow_log;
|
|
|
|
alter table mysql.general_log engine=myisam;
|
|
alter table mysql.slow_log engine=myisam;
|
|
|
|
# check that the tables were converted
|
|
show create table mysql.general_log;
|
|
show create table mysql.slow_log;
|
|
|
|
# enable log tables and chek that new tables indeed work
|
|
set global general_log='ON';
|
|
set global slow_query_log='ON';
|
|
|
|
--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID
|
|
select * from mysql.general_log;
|
|
|
|
# check that flush of myisam-based log tables work fine
|
|
flush logs;
|
|
|
|
# check locking of myisam-based log tables
|
|
|
|
--error ER_CANT_WRITE_LOCK_LOG_TABLE
|
|
lock tables mysql.general_log WRITE;
|
|
|
|
--error ER_CANT_WRITE_LOCK_LOG_TABLE
|
|
lock tables mysql.slow_log WRITE;
|
|
|
|
#
|
|
# This attemts to get TL_READ_NO_INSERT lock, which is incompatible with
|
|
# TL_WRITE_CONCURRENT_INSERT. This should fail. We issue this error as log
|
|
# tables are always opened and locked by the logger.
|
|
#
|
|
|
|
--error ER_CANT_READ_LOCK_LOG_TABLE
|
|
lock tables mysql.general_log READ;
|
|
|
|
--error ER_CANT_READ_LOCK_LOG_TABLE
|
|
lock tables mysql.slow_log READ;
|
|
|
|
#
|
|
# This call should result in TL_READ lock on the log table. This is ok and
|
|
# should pass.
|
|
#
|
|
|
|
lock tables mysql.slow_log READ LOCAL, mysql.general_log READ LOCAL;
|
|
|
|
unlock tables;
|
|
|
|
# check that we can drop them
|
|
set global general_log='OFF';
|
|
set global slow_query_log='OFF';
|
|
|
|
# check that alter table doesn't work for other engines
|
|
set @save_storage_engine= @@session.storage_engine;
|
|
set storage_engine= MEMORY;
|
|
--error ER_UNSUPORTED_LOG_ENGINE
|
|
alter table mysql.slow_log engine=ndb;
|
|
--error ER_UNSUPORTED_LOG_ENGINE
|
|
alter table mysql.slow_log engine=innodb;
|
|
--error ER_UNSUPORTED_LOG_ENGINE
|
|
alter table mysql.slow_log engine=archive;
|
|
--error ER_UNSUPORTED_LOG_ENGINE
|
|
alter table mysql.slow_log engine=blackhole;
|
|
set storage_engine= @save_storage_engine;
|
|
|
|
drop table mysql.slow_log;
|
|
drop table mysql.general_log;
|
|
|
|
# check that table share cleanup is performed correctly (double drop)
|
|
|
|
--error ER_BAD_TABLE_ERROR
|
|
drop table mysql.general_log;
|
|
--error ER_BAD_TABLE_ERROR
|
|
drop table mysql.slow_log;
|
|
|
|
# recreate tables and enable logs
|
|
|
|
use mysql;
|
|
|
|
CREATE TABLE `general_log` (
|
|
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
ON UPDATE CURRENT_TIMESTAMP,
|
|
`user_host` mediumtext,
|
|
`thread_id` int(11) DEFAULT NULL,
|
|
`server_id` int(11) DEFAULT NULL,
|
|
`command_type` varchar(64) DEFAULT NULL,
|
|
`argument` mediumtext
|
|
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';
|
|
|
|
CREATE TABLE `slow_log` (
|
|
`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
ON UPDATE CURRENT_TIMESTAMP,
|
|
`user_host` mediumtext NOT NULL,
|
|
`query_time` time NOT NULL,
|
|
`lock_time` time NOT NULL,
|
|
`rows_sent` int(11) NOT NULL,
|
|
`rows_examined` int(11) NOT NULL,
|
|
`db` varchar(512) DEFAULT NULL,
|
|
`last_insert_id` int(11) DEFAULT NULL,
|
|
`insert_id` int(11) DEFAULT NULL,
|
|
`server_id` int(11) DEFAULT NULL,
|
|
`sql_text` mediumtext NOT NULL
|
|
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';
|
|
|
|
set global general_log='ON';
|
|
set global slow_query_log='ON';
|
|
use test;
|
|
|
|
#
|
|
# Bug #20139 Infinite loop after "FLUSH" and "LOCK tabX, general_log"
|
|
#
|
|
|
|
flush tables with read lock;
|
|
unlock tables;
|
|
use mysql;
|
|
lock tables general_log read local, help_category read local;
|
|
unlock tables;
|
|
|
|
#
|
|
# Bug #17544 Cannot do atomic log rotate and
|
|
# Bug #21785 Server crashes after rename of the log table
|
|
#
|
|
|
|
use mysql;
|
|
# Should result in error
|
|
--error ER_CANT_RENAME_LOG_TABLE
|
|
RENAME TABLE general_log TO renamed_general_log;
|
|
--error ER_CANT_RENAME_LOG_TABLE
|
|
RENAME TABLE slow_log TO renamed_slow_log;
|
|
|
|
#check rotate logs
|
|
truncate table general_log;
|
|
--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID
|
|
select * from general_log;
|
|
|
|
truncate table slow_log;
|
|
--replace_column 1 TIMESTAMP 2 USER_HOST
|
|
select * from slow_log;
|
|
|
|
create table general_log_new like general_log;
|
|
rename table general_log TO renamed_general_log, general_log_new TO general_log;
|
|
|
|
create table slow_log_new like slow_log;
|
|
rename table slow_log TO renamed_slow_log, slow_log_new TO slow_log;
|
|
|
|
# check that rename checks more then first table in the list
|
|
--error ER_CANT_RENAME_LOG_TABLE
|
|
rename table general_log TO general_log_new, renamed_general_log TO general_log, slow_log to renamed_slow_log;
|
|
|
|
# now check the content of tables
|
|
--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID
|
|
select * from general_log;
|
|
--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID
|
|
select * from renamed_general_log;
|
|
|
|
# the content of the slow log is empty, but we will try a select anyway
|
|
--replace_column 1 TIMESTAMP 2 USER_HOST
|
|
select * from slow_log;
|
|
--replace_column 1 TIMESTAMP 2 USER_HOST
|
|
select * from renamed_slow_log;
|
|
|
|
# check that we can do whatever we want with disabled log
|
|
set global general_log='OFF';
|
|
RENAME TABLE general_log TO general_log2;
|
|
|
|
set global slow_query_log='OFF';
|
|
RENAME TABLE slow_log TO slow_log2;
|
|
|
|
# this should fail
|
|
--error ER_CANT_ACTIVATE_LOG
|
|
set global general_log='ON';
|
|
--error ER_CANT_ACTIVATE_LOG
|
|
set global slow_query_log='ON';
|
|
|
|
RENAME TABLE general_log2 TO general_log;
|
|
RENAME TABLE slow_log2 TO slow_log;
|
|
|
|
# this should work
|
|
set global general_log='ON';
|
|
set global slow_query_log='ON';
|
|
# now check flush logs
|
|
flush logs;
|
|
flush logs;
|
|
drop table renamed_general_log, renamed_slow_log;
|
|
use test;
|
|
|
|
#
|
|
# Bug #21966 Strange warnings on repair of the log tables
|
|
#
|
|
|
|
use mysql;
|
|
# check that no warning occurs on repair of the log tables
|
|
repair table general_log;
|
|
repair table slow_log;
|
|
# check that no warning occurs on "create like" for the log tables
|
|
create table general_log_new like general_log;
|
|
create table slow_log_new like slow_log;
|
|
show tables like "%log%";
|
|
drop table slow_log_new, general_log_new;
|
|
use test;
|
|
|
|
# kill all connections
|
|
disconnect con1;
|
|
disconnect con2;
|
|
--enable_ps_protocol
|
|
|