List:Commits« Previous MessageNext Message »
From:Petr Chardin Date:August 4 2006 10:49am
Subject:bk commit into 5.1 tree (petr:1.2246)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of cps. When cps does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2006-08-04 14:48:51+04:00, petr@owlet. +5 -0
  Merge pchardin@stripped:/home/bk/mysql-5.1-runtime
  into  mysql.com:/home/cps/mysql/devel/5.1-curs-bug
  MERGE: 1.2181.163.1

  mysql-test/r/log_tables.result@stripped, 2006-08-04 14:48:47+04:00, petr@owlet. +0 -0
    SCCS merged
    MERGE: 1.5.1.1

  mysql-test/t/log_tables.test@stripped, 2006-08-04 14:48:47+04:00, petr@owlet. +0 -0
    SCCS merged
    MERGE: 1.10.1.1

  sql/ha_myisam.cc@stripped, 2006-08-04 14:28:14+04:00, petr@owlet. +0 -0
    Auto merged
    MERGE: 1.184.1.1

  sql/handler.h@stripped, 2006-08-04 14:28:14+04:00, petr@owlet. +0 -0
    Auto merged
    MERGE: 1.224.1.1

  sql/sql_table.cc@stripped, 2006-08-04 14:28:14+04:00, petr@owlet. +0 -0
    Auto merged
    MERGE: 1.358.2.1

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	petr
# Host:	owlet.
# Root:	/home/cps/mysql/devel/5.1-curs-bug/RESYNC

--- 1.185/sql/ha_myisam.cc	2006-08-04 14:49:00 +04:00
+++ 1.186/sql/ha_myisam.cc	2006-08-04 14:49:00 +04:00
@@ -274,6 +274,15 @@ bool ha_myisam::check_if_locking_is_allo
              table->s->table_name.str);
     return FALSE;
   }
+
+  /*
+    Deny locking of the log tables, which is incompatible with
+    concurrent insert. Unless called from a logger THD:
+    general_log_thd or slow_log_thd.
+  */
+  if (!called_by_logger_thread)
+    return check_if_log_table_locking_is_allowed(sql_command, type, table);
+
   return TRUE;
 }
 

--- 1.230/sql/handler.h	2006-08-04 14:49:00 +04:00
+++ 1.231/sql/handler.h	2006-08-04 14:49:00 +04:00
@@ -974,6 +974,8 @@ public:
   {
     return TRUE;
   }
+  bool check_if_log_table_locking_is_allowed(uint sql_command,
+                                             ulong type, TABLE *table);
   int ha_open(TABLE *table, const char *name, int mode, int test_if_locked);
   void adjust_next_insert_id_after_explicit_value(ulonglong nr);
   bool update_auto_increment();

--- 1.362/sql/sql_table.cc	2006-08-04 14:49:00 +04:00
+++ 1.363/sql/sql_table.cc	2006-08-04 14:49:00 +04:00
@@ -1537,6 +1537,18 @@ int mysql_rm_table_part2(THD *thd, TABLE
     table->db_type= NULL;
     if ((share= get_cached_table_share(table->db, table->table_name)))
       table->db_type= share->db_type;
+
+    /* Disable drop of enabled log tables */
+    if (share && share->log_table &&
+        ((!my_strcasecmp(system_charset_info, table->table_name,
+                         "general_log") && opt_log &&
+          logger.is_general_log_table_enabled()) ||
+         (!my_strcasecmp(system_charset_info, table->table_name, "slow_log")
+          && opt_slow_log && logger.is_slow_log_table_enabled())))
+    {
+      my_error(ER_CANT_DROP_LOG_TABLE, MYF(0));
+      DBUG_RETURN(1);
+    }
   }
 
   if (lock_table_names(thd, tables))
@@ -5002,6 +5014,42 @@ bool mysql_alter_table(THD *thd,char *ne
   LINT_INIT(index_drop_count);
   LINT_INIT(index_add_buffer);
   LINT_INIT(index_drop_buffer);
+
+  if (table_list && table_list->db &&
+      !my_strcasecmp(system_charset_info, table_list->db, "mysql") &&
+      table_list->table_name)
+  {
+    enum enum_table_kind { NOT_LOG_TABLE= 1, GENERAL_LOG, SLOW_LOG }
+         table_kind= NOT_LOG_TABLE;
+
+    if (!my_strcasecmp(system_charset_info, table_list->table_name,
+                       "general_log"))
+      table_kind= GENERAL_LOG;
+    else
+      if (!my_strcasecmp(system_charset_info, table_list->table_name,
+                         "slow_log"))
+        table_kind= SLOW_LOG;
+
+    /* Disable alter of enabled log tables */
+    if ((table_kind == GENERAL_LOG && opt_log &&
+        logger.is_general_log_table_enabled()) ||
+       (table_kind == SLOW_LOG && opt_slow_log &&
+         logger.is_slow_log_table_enabled()))
+    {
+      my_error(ER_CANT_ALTER_LOG_TABLE, MYF(0));
+      DBUG_RETURN(TRUE);
+    }
+
+    /* Disable alter of log tables to unsupported engine */
+    if ((table_kind == GENERAL_LOG || table_kind == SLOW_LOG) &&
+        (lex_create_info->used_fields & HA_CREATE_USED_ENGINE) &&
+        !(lex_create_info->db_type->db_type == DB_TYPE_MYISAM ||
+          lex_create_info->db_type->db_type == DB_TYPE_CSV_DB))
+    {
+      my_error(ER_BAD_LOG_ENGINE, MYF(0));
+      DBUG_RETURN(TRUE);
+    }
+  }
 
   thd->proc_info="init";
   if (!(create_info= copy_create_info(lex_create_info)))

--- 1.6/mysql-test/r/log_tables.result	2006-08-04 14:49:00 +04:00
+++ 1.7/mysql-test/r/log_tables.result	2006-08-04 14:49:00 +04:00
@@ -72,6 +72,147 @@ sleep(2)
 select * from mysql.slow_log;
 start_time	user_host	query_time	lock_time	rows_sent	rows_examined	db	last_insert_id	insert_id	server_id	sql_text
 TIMESTAMP	USER_HOST	QUERY_TIME	00:00:00	1	0	test	0	0	1	select sleep(2)
+alter table mysql.general_log engine=myisam;
+ERROR HY000: You can't alter a log table if logging is enabled
+alter table mysql.slow_log engine=myisam;
+ERROR HY000: You can't alter a log table if logging is enabled
+drop table mysql.general_log;
+ERROR HY000: Cannot drop log table if log is enabled
+drop table mysql.slow_log;
+ERROR HY000: Cannot drop log table if log is enabled
+set global general_log='OFF';
+alter table mysql.slow_log engine=myisam;
+ERROR HY000: You can't alter a log table if logging is enabled
+set global slow_query_log='OFF';
+show create table mysql.general_log;
+Table	Create Table
+general_log	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'
+show create table mysql.slow_log;
+Table	Create Table
+slow_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'
+alter table mysql.general_log engine=myisam;
+alter table mysql.slow_log engine=myisam;
+Warnings:
+Warning	1264	Out of range value for column 'last_insert_id' at row 0
+Warning	1264	Out of range value for column 'insert_id' at row 0
+show create table mysql.general_log;
+Table	Create Table
+general_log	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=MyISAM DEFAULT CHARSET=utf8 COMMENT='General log'
+show create table mysql.slow_log;
+Table	Create Table
+slow_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=MyISAM DEFAULT CHARSET=utf8 COMMENT='Slow log'
+set global general_log='ON';
+set global slow_query_log='ON';
+select * from mysql.general_log;
+event_time	user_host	thread_id	server_id	command_type	argument
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	set names utf8
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	create table bug16905 (s char(15) character set utf8 default 'пусто')
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	insert into bug16905 values ('новое')
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	select * from mysql.general_log
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	drop table bug16905
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	truncate table mysql.slow_log
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	set session long_query_time=1
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	select sleep(2)
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	select * from mysql.slow_log
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	alter table mysql.general_log engine=myisam
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	alter table mysql.slow_log engine=myisam
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	drop table mysql.general_log
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	drop table mysql.slow_log
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	set global general_log='OFF'
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	set global slow_query_log='ON'
+TIMESTAMP	USER_HOST	THREAD_ID	1	Query	select * from mysql.general_log
+flush logs;
+lock tables mysql.general_log WRITE;
+ERROR HY000: You can't write-lock a log table. Only read access is possible.
+lock tables mysql.slow_log WRITE;
+ERROR HY000: You can't write-lock a log table. Only read access is possible.
+lock tables mysql.general_log READ;
+ERROR HY000: You can't use usual read lock with log tables. Try READ LOCAL instead.
+lock tables mysql.slow_log READ;
+ERROR HY000: You can't use usual read lock with log tables. Try READ LOCAL instead.
+lock tables mysql.slow_log READ LOCAL, mysql.general_log READ LOCAL;
+unlock tables;
+set global general_log='OFF';
+set global slow_query_log='OFF';
+alter table mysql.slow_log engine=ndb;
+ERROR HY000: One can use only CSV and MyISAM engines for the log tables
+alter table mysql.slow_log engine=innodb;
+ERROR HY000: One can use only CSV and MyISAM engines for the log tables
+alter table mysql.slow_log engine=archive;
+ERROR HY000: One can use only CSV and MyISAM engines for the log tables
+alter table mysql.slow_log engine=blackhole;
+ERROR HY000: One can use only CSV and MyISAM engines for the log tables
+drop table mysql.slow_log;
+drop table mysql.general_log;
+drop table mysql.general_log;
+ERROR 42S02: Unknown table 'general_log'
+drop table mysql.slow_log;
+ERROR 42S02: Unknown table 'slow_log'
+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;
 flush tables with read lock;
 unlock tables;
 use mysql;

--- 1.11/mysql-test/t/log_tables.test	2006-08-04 14:49:00 +04:00
+++ 1.12/mysql-test/t/log_tables.test	2006-08-04 14:49:00 +04:00
@@ -172,6 +172,139 @@ select sleep(2);
 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_CANT_ALTER_LOG_TABLE
+alter table mysql.general_log engine=myisam;
+--error ER_CANT_ALTER_LOG_TABLE
+alter table mysql.slow_log engine=myisam;
+
+--error ER_CANT_DROP_LOG_TABLE
+drop table mysql.general_log;
+--error ER_CANT_DROP_LOG_TABLE
+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_CANT_ALTER_LOG_TABLE
+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
+--error ER_BAD_LOG_ENGINE
+alter table mysql.slow_log engine=ndb;
+--error ER_BAD_LOG_ENGINE
+alter table mysql.slow_log engine=innodb;
+--error ER_BAD_LOG_ENGINE
+alter table mysql.slow_log engine=archive;
+--error ER_BAD_LOG_ENGINE
+alter table mysql.slow_log engine=blackhole;
+
+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"
 #
 
Thread
bk commit into 5.1 tree (petr:1.2246)Petr Chardin4 Aug