Merge bk-internal.mysql.com:/home/bk/mysql-5.1
into bodhi.(none):/opt/local/work/mysql-5.1-runtime client/mysqldump.c: Auto merged mysql-test/r/mysqldump.result: Auto merged mysql-test/t/disabled.def: Auto merged mysql-test/t/mysqldump.test: Auto merged sql/handler.cc: Auto merged sql/lock.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_lex.cc: Auto merged sql/sql_parse.cc: Auto merged sql/sql_table.cc: Auto merged sql/table.cc: Auto merged sql/table.h: Auto merged mysql-test/include/mix1.inc: Manual merge. mysql-test/r/innodb_mysql.result: Manual merge.
This commit is contained in:
commit
2914bad6ac
@ -2116,7 +2116,10 @@ static uint get_table_structure(char *table, char *db, char *table_type,
|
|||||||
MYSQL_FIELD *field;
|
MYSQL_FIELD *field;
|
||||||
|
|
||||||
my_snprintf(buff, sizeof(buff), "show create table %s", result_table);
|
my_snprintf(buff, sizeof(buff), "show create table %s", result_table);
|
||||||
if (mysql_query_with_error_report(mysql, 0, buff))
|
|
||||||
|
if (switch_character_set_results(mysql, "binary") ||
|
||||||
|
mysql_query_with_error_report(mysql, &result, buff) ||
|
||||||
|
switch_character_set_results(mysql, default_charset))
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
if (path)
|
if (path)
|
||||||
@ -2147,7 +2150,6 @@ static uint get_table_structure(char *table, char *db, char *table_type,
|
|||||||
check_io(sql_file);
|
check_io(sql_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
result= mysql_store_result(mysql);
|
|
||||||
field= mysql_fetch_field_direct(result, 0);
|
field= mysql_fetch_field_direct(result, 0);
|
||||||
if (strcmp(field->name, "View") == 0)
|
if (strcmp(field->name, "View") == 0)
|
||||||
{
|
{
|
||||||
@ -2174,7 +2176,9 @@ static uint get_table_structure(char *table, char *db, char *table_type,
|
|||||||
*/
|
*/
|
||||||
my_snprintf(query_buff, sizeof(query_buff),
|
my_snprintf(query_buff, sizeof(query_buff),
|
||||||
"SHOW FIELDS FROM %s", result_table);
|
"SHOW FIELDS FROM %s", result_table);
|
||||||
if (mysql_query_with_error_report(mysql, 0, query_buff))
|
if (switch_character_set_results(mysql, "binary") ||
|
||||||
|
mysql_query_with_error_report(mysql, &result, query_buff) ||
|
||||||
|
switch_character_set_results(mysql, default_charset))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
View references invalid or privileged table/col/fun (err 1356),
|
View references invalid or privileged table/col/fun (err 1356),
|
||||||
@ -2192,43 +2196,50 @@ static uint get_table_structure(char *table, char *db, char *table_type,
|
|||||||
else
|
else
|
||||||
my_free(scv_buff, MYF(MY_ALLOW_ZERO_PTR));
|
my_free(scv_buff, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
|
||||||
if ((result= mysql_store_result(mysql)))
|
if (mysql_num_rows(result))
|
||||||
{
|
{
|
||||||
if (mysql_num_rows(result))
|
if (opt_drop)
|
||||||
{
|
{
|
||||||
if (opt_drop)
|
|
||||||
{
|
|
||||||
/*
|
/*
|
||||||
We have already dropped any table of the same name
|
We have already dropped any table of the same name above, so
|
||||||
above, so here we just drop the view.
|
here we just drop the view.
|
||||||
*/
|
|
||||||
|
|
||||||
fprintf(sql_file, "/*!50001 DROP VIEW IF EXISTS %s*/;\n",
|
|
||||||
opt_quoted_table);
|
|
||||||
check_io(sql_file);
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(sql_file, "/*!50001 CREATE TABLE %s (\n", result_table);
|
|
||||||
/*
|
|
||||||
Get first row, following loop will prepend comma - keeps
|
|
||||||
from having to know if the row being printed is last to
|
|
||||||
determine if there should be a _trailing_ comma.
|
|
||||||
*/
|
*/
|
||||||
row= mysql_fetch_row(result);
|
|
||||||
|
|
||||||
fprintf(sql_file, " %s %s", quote_name(row[0], name_buff, 0),
|
fprintf(sql_file, "/*!50001 DROP VIEW IF EXISTS %s*/;\n",
|
||||||
row[1]);
|
opt_quoted_table);
|
||||||
|
|
||||||
while((row= mysql_fetch_row(result)))
|
|
||||||
{
|
|
||||||
/* col name, col type */
|
|
||||||
fprintf(sql_file, ",\n %s %s",
|
|
||||||
quote_name(row[0], name_buff, 0), row[1]);
|
|
||||||
}
|
|
||||||
fprintf(sql_file, "\n) */;\n");
|
|
||||||
check_io(sql_file);
|
check_io(sql_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fprintf(sql_file,
|
||||||
|
"SET @saved_cs_client = @@character_set_client;\n"
|
||||||
|
"SET character_set_client = utf8;\n"
|
||||||
|
"/*!50001 CREATE TABLE %s (\n",
|
||||||
|
result_table);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Get first row, following loop will prepend comma - keeps from
|
||||||
|
having to know if the row being printed is last to determine if
|
||||||
|
there should be a _trailing_ comma.
|
||||||
|
*/
|
||||||
|
|
||||||
|
row= mysql_fetch_row(result);
|
||||||
|
|
||||||
|
fprintf(sql_file, " %s %s", quote_name(row[0], name_buff, 0),
|
||||||
|
row[1]);
|
||||||
|
|
||||||
|
while((row= mysql_fetch_row(result)))
|
||||||
|
{
|
||||||
|
/* col name, col type */
|
||||||
|
fprintf(sql_file, ",\n %s %s",
|
||||||
|
quote_name(row[0], name_buff, 0), row[1]);
|
||||||
|
}
|
||||||
|
fprintf(sql_file,
|
||||||
|
"\n) */;\n"
|
||||||
|
"SET character_set_client = @saved_cs_client;\n");
|
||||||
|
|
||||||
|
check_io(sql_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
mysql_free_result(result);
|
mysql_free_result(result);
|
||||||
|
|
||||||
if (path)
|
if (path)
|
||||||
@ -2239,7 +2250,14 @@ static uint get_table_structure(char *table, char *db, char *table_type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
row= mysql_fetch_row(result);
|
row= mysql_fetch_row(result);
|
||||||
fprintf(sql_file, "%s;\n", row[1]);
|
|
||||||
|
fprintf(sql_file,
|
||||||
|
"SET @saved_cs_client = @@character_set_client;\n"
|
||||||
|
"SET character_set_client = utf8;\n"
|
||||||
|
"%s;\n"
|
||||||
|
"SET character_set_client = @saved_cs_client;\n",
|
||||||
|
row[1]);
|
||||||
|
|
||||||
check_io(sql_file);
|
check_io(sql_file);
|
||||||
mysql_free_result(result);
|
mysql_free_result(result);
|
||||||
}
|
}
|
||||||
@ -3726,11 +3744,12 @@ static int dump_all_tables_in_db(char *database)
|
|||||||
{
|
{
|
||||||
DYNAMIC_STRING query;
|
DYNAMIC_STRING query;
|
||||||
init_dynamic_string_checked(&query, "LOCK TABLES ", 256, 1024);
|
init_dynamic_string_checked(&query, "LOCK TABLES ", 256, 1024);
|
||||||
for (numrows= 0 ; (table= getTableName(1)) ; numrows++)
|
for (numrows= 0 ; (table= getTableName(1)) ; )
|
||||||
{
|
{
|
||||||
char *end= strmov(afterdot, table);
|
char *end= strmov(afterdot, table);
|
||||||
if (include_table(hash_key,end - hash_key))
|
if (include_table(hash_key,end - hash_key))
|
||||||
{
|
{
|
||||||
|
numrows++;
|
||||||
dynstr_append_checked(&query, quote_name(table, table_buff, 1));
|
dynstr_append_checked(&query, quote_name(table, table_buff, 1));
|
||||||
dynstr_append_checked(&query, " READ /*!32311 LOCAL */,");
|
dynstr_append_checked(&query, " READ /*!32311 LOCAL */,");
|
||||||
}
|
}
|
||||||
@ -3804,6 +3823,11 @@ static my_bool dump_all_views_in_db(char *database)
|
|||||||
char *table;
|
char *table;
|
||||||
uint numrows;
|
uint numrows;
|
||||||
char table_buff[NAME_LEN*2+3];
|
char table_buff[NAME_LEN*2+3];
|
||||||
|
char hash_key[2*NAME_LEN+2]; /* "db.tablename" */
|
||||||
|
char *afterdot;
|
||||||
|
|
||||||
|
afterdot= strmov(hash_key, database);
|
||||||
|
*afterdot++= '.';
|
||||||
|
|
||||||
if (init_dumping(database, init_dumping_views))
|
if (init_dumping(database, init_dumping_views))
|
||||||
return 1;
|
return 1;
|
||||||
@ -3813,10 +3837,15 @@ static my_bool dump_all_views_in_db(char *database)
|
|||||||
{
|
{
|
||||||
DYNAMIC_STRING query;
|
DYNAMIC_STRING query;
|
||||||
init_dynamic_string_checked(&query, "LOCK TABLES ", 256, 1024);
|
init_dynamic_string_checked(&query, "LOCK TABLES ", 256, 1024);
|
||||||
for (numrows= 0 ; (table= getTableName(1)); numrows++)
|
for (numrows= 0 ; (table= getTableName(1)); )
|
||||||
{
|
{
|
||||||
dynstr_append_checked(&query, quote_name(table, table_buff, 1));
|
char *end= strmov(afterdot, table);
|
||||||
dynstr_append_checked(&query, " READ /*!32311 LOCAL */,");
|
if (include_table(hash_key,end - hash_key))
|
||||||
|
{
|
||||||
|
numrows++;
|
||||||
|
dynstr_append_checked(&query, quote_name(table, table_buff, 1));
|
||||||
|
dynstr_append_checked(&query, " READ /*!32311 LOCAL */,");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (numrows && mysql_real_query(mysql, query.str, query.length-1))
|
if (numrows && mysql_real_query(mysql, query.str, query.length-1))
|
||||||
DB_error(mysql, "when using LOCK TABLES");
|
DB_error(mysql, "when using LOCK TABLES");
|
||||||
@ -3830,7 +3859,11 @@ static my_bool dump_all_views_in_db(char *database)
|
|||||||
/* We shall continue here, if --force was given */
|
/* We shall continue here, if --force was given */
|
||||||
}
|
}
|
||||||
while ((table= getTableName(0)))
|
while ((table= getTableName(0)))
|
||||||
get_view_structure(table, database);
|
{
|
||||||
|
char *end= strmov(afterdot, table);
|
||||||
|
if (include_table(hash_key, end - hash_key))
|
||||||
|
get_view_structure(table, database);
|
||||||
|
}
|
||||||
if (opt_xml)
|
if (opt_xml)
|
||||||
{
|
{
|
||||||
fputs("</database>\n", md_result_file);
|
fputs("</database>\n", md_result_file);
|
||||||
|
@ -814,6 +814,38 @@ create table t1 (a int) engine=innodb;
|
|||||||
alter table t1 alter a set default 1;
|
alter table t1 alter a set default 1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo Bug#24918 drop table and lock / inconsistent between
|
||||||
|
--echo perm and temp tables
|
||||||
|
--echo
|
||||||
|
--echo Check transactional tables under LOCK TABLES
|
||||||
|
--echo
|
||||||
|
--disable_warnings
|
||||||
|
drop table if exists t24918, t24918_tmp, t24918_trans, t24918_trans_tmp,
|
||||||
|
t24918_access;
|
||||||
|
--enable_warnings
|
||||||
|
create table t24918_access (id int);
|
||||||
|
create table t24918 (id int) engine=myisam;
|
||||||
|
create temporary table t24918_tmp (id int) engine=myisam;
|
||||||
|
create table t24918_trans (id int) engine=innodb;
|
||||||
|
create temporary table t24918_trans_tmp (id int) engine=innodb;
|
||||||
|
|
||||||
|
lock table t24918 write, t24918_tmp write, t24918_trans write, t24918_trans_tmp write;
|
||||||
|
drop table t24918;
|
||||||
|
--error ER_TABLE_NOT_LOCKED
|
||||||
|
select * from t24918_access;
|
||||||
|
drop table t24918_trans;
|
||||||
|
--error ER_TABLE_NOT_LOCKED
|
||||||
|
select * from t24918_access;
|
||||||
|
drop table t24918_trans_tmp;
|
||||||
|
--error ER_TABLE_NOT_LOCKED
|
||||||
|
select * from t24918_access;
|
||||||
|
drop table t24918_tmp;
|
||||||
|
--error ER_TABLE_NOT_LOCKED
|
||||||
|
select * from t24918_access;
|
||||||
|
unlock tables;
|
||||||
|
|
||||||
|
drop table t24918_access;
|
||||||
#
|
#
|
||||||
# Bug #28591: MySQL need not sort the records in case of ORDER BY
|
# Bug #28591: MySQL need not sort the records in case of ORDER BY
|
||||||
# primary_key on InnoDB table
|
# primary_key on InnoDB table
|
||||||
|
@ -1689,12 +1689,18 @@ DELETE FROM mysqltest2.log|
|
|||||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 */;
|
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 */;
|
||||||
|
|
||||||
USE `mysqltest1`;
|
USE `mysqltest1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `log` (
|
CREATE TABLE `log` (
|
||||||
`msg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
|
`msg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`c` int(11) DEFAULT NULL
|
`c` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
INSERT INTO `t1` VALUES (1),(0),(1);
|
INSERT INTO `t1` VALUES (1),(0),(1);
|
||||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||||
@ -1762,12 +1768,18 @@ ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
|||||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 */;
|
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 */;
|
||||||
|
|
||||||
USE `mysqltest2`;
|
USE `mysqltest2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `log` (
|
CREATE TABLE `log` (
|
||||||
`msg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
|
`msg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`c` int(11) DEFAULT NULL
|
`c` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
INSERT INTO `t1` VALUES (1),(0),(1);
|
INSERT INTO `t1` VALUES (1),(0),(1);
|
||||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||||
|
@ -1689,12 +1689,18 @@ DELETE FROM mysqltest2.log|
|
|||||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 */;
|
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 */;
|
||||||
|
|
||||||
USE `mysqltest1`;
|
USE `mysqltest1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `log` (
|
CREATE TABLE `log` (
|
||||||
`msg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
|
`msg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`c` int(11) DEFAULT NULL
|
`c` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
INSERT INTO `t1` VALUES (1),(0),(1);
|
INSERT INTO `t1` VALUES (1),(0),(1);
|
||||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||||
@ -1762,12 +1768,18 @@ ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
|||||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 */;
|
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 */;
|
||||||
|
|
||||||
USE `mysqltest2`;
|
USE `mysqltest2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `log` (
|
CREATE TABLE `log` (
|
||||||
`msg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
|
`msg` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`c` int(11) DEFAULT NULL
|
`c` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
INSERT INTO `t1` VALUES (1),(0),(1);
|
INSERT INTO `t1` VALUES (1),(0),(1);
|
||||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||||
|
@ -611,3 +611,10 @@ id ev_nm ev_cnt
|
|||||||
DROP TABLE event_log;
|
DROP TABLE event_log;
|
||||||
SET GLOBAL event_scheduler = OFF;
|
SET GLOBAL event_scheduler = OFF;
|
||||||
DROP DATABASE events_test;
|
DROP DATABASE events_test;
|
||||||
|
SET GLOBAL event_scheduler= ON;
|
||||||
|
CREATE EVENT bug28641 ON SCHEDULE AT '2038.01.18 03:00:00'
|
||||||
|
DO BEGIN
|
||||||
|
SELECT 1;
|
||||||
|
END;|
|
||||||
|
SET GLOBAL event_scheduler= OFF;
|
||||||
|
DROP EVENT bug28641;
|
||||||
|
@ -37,9 +37,10 @@ log-slow-queries option_value
|
|||||||
language option_value
|
language option_value
|
||||||
character-sets-dir option_value
|
character-sets-dir option_value
|
||||||
basedir option_value
|
basedir option_value
|
||||||
|
shutdown-delay option_value
|
||||||
skip-stack-trace option_value
|
skip-stack-trace option_value
|
||||||
skip-innodb option_value
|
loose-skip-innodb option_value
|
||||||
skip-ndbcluster option_value
|
loose-skip-ndbcluster option_value
|
||||||
nonguarded option_value
|
nonguarded option_value
|
||||||
log-output option_value
|
log-output option_value
|
||||||
SET mysqld2.server_id = 2;
|
SET mysqld2.server_id = 2;
|
||||||
@ -57,9 +58,10 @@ log-slow-queries option_value
|
|||||||
language option_value
|
language option_value
|
||||||
character-sets-dir option_value
|
character-sets-dir option_value
|
||||||
basedir option_value
|
basedir option_value
|
||||||
|
shutdown-delay option_value
|
||||||
skip-stack-trace option_value
|
skip-stack-trace option_value
|
||||||
skip-innodb option_value
|
loose-skip-innodb option_value
|
||||||
skip-ndbcluster option_value
|
loose-skip-ndbcluster option_value
|
||||||
nonguarded option_value
|
nonguarded option_value
|
||||||
log-output option_value
|
log-output option_value
|
||||||
server_id option_value
|
server_id option_value
|
||||||
|
@ -814,6 +814,34 @@ drop table if exists t1;
|
|||||||
create table t1 (a int) engine=innodb;
|
create table t1 (a int) engine=innodb;
|
||||||
alter table t1 alter a set default 1;
|
alter table t1 alter a set default 1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
Bug#24918 drop table and lock / inconsistent between
|
||||||
|
perm and temp tables
|
||||||
|
|
||||||
|
Check transactional tables under LOCK TABLES
|
||||||
|
|
||||||
|
drop table if exists t24918, t24918_tmp, t24918_trans, t24918_trans_tmp,
|
||||||
|
t24918_access;
|
||||||
|
create table t24918_access (id int);
|
||||||
|
create table t24918 (id int) engine=myisam;
|
||||||
|
create temporary table t24918_tmp (id int) engine=myisam;
|
||||||
|
create table t24918_trans (id int) engine=innodb;
|
||||||
|
create temporary table t24918_trans_tmp (id int) engine=innodb;
|
||||||
|
lock table t24918 write, t24918_tmp write, t24918_trans write, t24918_trans_tmp write;
|
||||||
|
drop table t24918;
|
||||||
|
select * from t24918_access;
|
||||||
|
ERROR HY000: Table 't24918_access' was not locked with LOCK TABLES
|
||||||
|
drop table t24918_trans;
|
||||||
|
select * from t24918_access;
|
||||||
|
ERROR HY000: Table 't24918_access' was not locked with LOCK TABLES
|
||||||
|
drop table t24918_trans_tmp;
|
||||||
|
select * from t24918_access;
|
||||||
|
ERROR HY000: Table 't24918_access' was not locked with LOCK TABLES
|
||||||
|
drop table t24918_tmp;
|
||||||
|
select * from t24918_access;
|
||||||
|
ERROR HY000: Table 't24918_access' was not locked with LOCK TABLES
|
||||||
|
unlock tables;
|
||||||
|
drop table t24918_access;
|
||||||
CREATE TABLE t1 (a int, b int, PRIMARY KEY (a), KEY bkey (b)) ENGINE=InnoDB;
|
CREATE TABLE t1 (a int, b int, PRIMARY KEY (a), KEY bkey (b)) ENGINE=InnoDB;
|
||||||
INSERT INTO t1 VALUES (1,2),(3,2),(2,2),(4,2),(5,2),(6,2),(7,2),(8,2);
|
INSERT INTO t1 VALUES (1,2),(3,2),(2,2),(4,2),(5,2),(6,2),(7,2),(8,2);
|
||||||
INSERT INTO t1 SELECT a + 8, 2 FROM t1;
|
INSERT INTO t1 SELECT a + 8, 2 FROM t1;
|
||||||
|
@ -153,3 +153,25 @@ select * from mysql.general_log;
|
|||||||
event_time user_host thread_id server_id command_type argument
|
event_time user_host thread_id server_id command_type argument
|
||||||
TIMESTAMP USER_HOST # 1 Query drop table t1
|
TIMESTAMP USER_HOST # 1 Query drop table t1
|
||||||
TIMESTAMP USER_HOST # 1 Query select * from mysql.general_log
|
TIMESTAMP USER_HOST # 1 Query select * from mysql.general_log
|
||||||
|
SET @old_general_log_state = @@global.general_log;
|
||||||
|
SET @old_slow_log_state = @@global.slow_query_log;
|
||||||
|
SET GLOBAL general_log = ON;
|
||||||
|
SET GLOBAL slow_query_log = ON;
|
||||||
|
FLUSH TABLES WITH READ LOCK;
|
||||||
|
SET GLOBAL general_log = OFF;
|
||||||
|
SET GLOBAL slow_query_log = OFF;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
FLUSH TABLES WITH READ LOCK;
|
||||||
|
SET GLOBAL general_log = ON;
|
||||||
|
SET GLOBAL slow_query_log = ON;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
SET GLOBAL READ_ONLY = ON;
|
||||||
|
SET GLOBAL general_log = OFF;
|
||||||
|
SET GLOBAL slow_query_log = OFF;
|
||||||
|
SET GLOBAL READ_ONLY = OFF;
|
||||||
|
SET GLOBAL READ_ONLY = ON;
|
||||||
|
SET GLOBAL general_log = ON;
|
||||||
|
SET GLOBAL slow_query_log = ON;
|
||||||
|
SET GLOBAL READ_ONLY = OFF;
|
||||||
|
SET GLOBAL general_log = @old_general_log_state;
|
||||||
|
SET GLOBAL slow_query_log = @old_slow_log_state;
|
||||||
|
@ -29,30 +29,83 @@ on (mysql.general_log.command_type = join_test.command_type)
|
|||||||
drop table join_test;
|
drop table join_test;
|
||||||
flush logs;
|
flush logs;
|
||||||
lock tables mysql.general_log WRITE;
|
lock tables mysql.general_log WRITE;
|
||||||
ERROR HY000: You can't write-lock a log table. Only read access is possible
|
ERROR HY000: You can't use locks with log tables.
|
||||||
lock tables mysql.slow_log WRITE;
|
lock tables mysql.slow_log WRITE;
|
||||||
ERROR HY000: You can't write-lock a log table. Only read access is possible
|
ERROR HY000: You can't use locks with log tables.
|
||||||
lock tables mysql.general_log READ;
|
lock tables mysql.general_log READ;
|
||||||
ERROR HY000: You can't use usual read lock with log tables. Try READ LOCAL instead
|
ERROR HY000: You can't use locks with log tables.
|
||||||
lock tables mysql.slow_log READ;
|
lock tables mysql.slow_log READ;
|
||||||
ERROR HY000: You can't use usual read lock with log tables. Try READ LOCAL instead
|
ERROR HY000: You can't use locks with log tables.
|
||||||
lock tables mysql.slow_log READ LOCAL, mysql.general_log READ LOCAL;
|
lock tables mysql.slow_log READ LOCAL, mysql.general_log READ LOCAL;
|
||||||
unlock tables;
|
ERROR HY000: You can't use locks with log tables.
|
||||||
lock tables mysql.general_log READ LOCAL;
|
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 fields from mysql.general_log;
|
||||||
|
Field Type Null Key Default Extra
|
||||||
|
event_time timestamp NO CURRENT_TIMESTAMP
|
||||||
|
user_host mediumtext YES NULL
|
||||||
|
thread_id int(11) YES NULL
|
||||||
|
server_id int(11) YES NULL
|
||||||
|
command_type varchar(64) YES NULL
|
||||||
|
argument mediumtext YES NULL
|
||||||
|
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'
|
||||||
|
show fields from mysql.slow_log;
|
||||||
|
Field Type Null Key Default Extra
|
||||||
|
start_time timestamp NO CURRENT_TIMESTAMP
|
||||||
|
user_host mediumtext NO
|
||||||
|
query_time time NO
|
||||||
|
lock_time time NO
|
||||||
|
rows_sent int(11) NO
|
||||||
|
rows_examined int(11) NO
|
||||||
|
db varchar(512) YES NULL
|
||||||
|
last_insert_id int(11) YES NULL
|
||||||
|
insert_id int(11) YES NULL
|
||||||
|
server_id int(11) YES NULL
|
||||||
|
sql_text mediumtext NO
|
||||||
flush logs;
|
flush logs;
|
||||||
unlock tables;
|
flush tables;
|
||||||
select "Mark that we woke up from flush logs in the test"
|
SET GLOBAL GENERAL_LOG=ON;
|
||||||
as "test passed";
|
SET GLOBAL SLOW_QUERY_LOG=ON;
|
||||||
test passed
|
show open tables;
|
||||||
Mark that we woke up from flush logs in the test
|
Database Table In_use Name_locked
|
||||||
lock tables mysql.general_log READ LOCAL;
|
mysql general_log 0 0
|
||||||
truncate mysql.general_log;
|
flush logs;
|
||||||
unlock tables;
|
show open tables;
|
||||||
select "Mark that we woke up from TRUNCATE in the test"
|
Database Table In_use Name_locked
|
||||||
as "test passed";
|
mysql general_log 0 0
|
||||||
test passed
|
flush tables;
|
||||||
Mark that we woke up from TRUNCATE in the test
|
show open tables;
|
||||||
use test;
|
Database Table In_use Name_locked
|
||||||
|
mysql general_log 0 0
|
||||||
|
SET GLOBAL GENERAL_LOG=OFF;
|
||||||
|
SET GLOBAL SLOW_QUERY_LOG=OFF;
|
||||||
|
flush tables;
|
||||||
|
show open tables;
|
||||||
|
Database Table In_use Name_locked
|
||||||
|
SET GLOBAL GENERAL_LOG=ON;
|
||||||
|
SET GLOBAL SLOW_QUERY_LOG=ON;
|
||||||
truncate table mysql.general_log;
|
truncate table mysql.general_log;
|
||||||
set names utf8;
|
set names utf8;
|
||||||
create table bug16905 (s char(15) character set utf8 default 'пусто');
|
create table bug16905 (s char(15) character set utf8 default 'пусто');
|
||||||
@ -71,7 +124,7 @@ sleep(2)
|
|||||||
0
|
0
|
||||||
select * from mysql.slow_log;
|
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
|
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)
|
TIMESTAMP USER_HOST QUERY_TIME 00:00:00 1 0 mysql 0 0 1 select sleep(2)
|
||||||
alter table mysql.general_log engine=myisam;
|
alter table mysql.general_log engine=myisam;
|
||||||
ERROR HY000: You cannot 'ALTER' a log table if logging is enabled
|
ERROR HY000: You cannot 'ALTER' a log table if logging is enabled
|
||||||
alter table mysql.slow_log engine=myisam;
|
alter table mysql.slow_log engine=myisam;
|
||||||
@ -158,15 +211,13 @@ 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
|
TIMESTAMP USER_HOST THREAD_ID 1 Query select * from mysql.general_log
|
||||||
flush logs;
|
flush logs;
|
||||||
lock tables mysql.general_log WRITE;
|
lock tables mysql.general_log WRITE;
|
||||||
ERROR HY000: You can't write-lock a log table. Only read access is possible
|
ERROR HY000: You can't use locks with log tables.
|
||||||
lock tables mysql.slow_log WRITE;
|
lock tables mysql.slow_log WRITE;
|
||||||
ERROR HY000: You can't write-lock a log table. Only read access is possible
|
ERROR HY000: You can't use locks with log tables.
|
||||||
lock tables mysql.general_log READ;
|
lock tables mysql.general_log READ;
|
||||||
ERROR HY000: You can't use usual read lock with log tables. Try READ LOCAL instead
|
ERROR HY000: You can't use locks with log tables.
|
||||||
lock tables mysql.slow_log READ;
|
lock tables mysql.slow_log READ;
|
||||||
ERROR HY000: You can't use usual read lock with log tables. Try READ LOCAL instead
|
ERROR HY000: You can't use locks with log tables.
|
||||||
lock tables mysql.slow_log READ LOCAL, mysql.general_log READ LOCAL;
|
|
||||||
unlock tables;
|
|
||||||
set global general_log='OFF';
|
set global general_log='OFF';
|
||||||
set global slow_query_log='OFF';
|
set global slow_query_log='OFF';
|
||||||
set @save_storage_engine= @@session.storage_engine;
|
set @save_storage_engine= @@session.storage_engine;
|
||||||
@ -217,6 +268,7 @@ flush tables with read lock;
|
|||||||
unlock tables;
|
unlock tables;
|
||||||
use mysql;
|
use mysql;
|
||||||
lock tables general_log read local, help_category read local;
|
lock tables general_log read local, help_category read local;
|
||||||
|
ERROR HY000: You can't use locks with log tables.
|
||||||
unlock tables;
|
unlock tables;
|
||||||
use mysql;
|
use mysql;
|
||||||
RENAME TABLE general_log TO renamed_general_log;
|
RENAME TABLE general_log TO renamed_general_log;
|
||||||
@ -258,9 +310,9 @@ RENAME TABLE general_log TO general_log2;
|
|||||||
set global slow_query_log='OFF';
|
set global slow_query_log='OFF';
|
||||||
RENAME TABLE slow_log TO slow_log2;
|
RENAME TABLE slow_log TO slow_log2;
|
||||||
set global general_log='ON';
|
set global general_log='ON';
|
||||||
ERROR HY000: Cannot activate 'general' log
|
ERROR 42S02: Table 'mysql.general_log' doesn't exist
|
||||||
set global slow_query_log='ON';
|
set global slow_query_log='ON';
|
||||||
ERROR HY000: Cannot activate 'slow query' log
|
ERROR 42S02: Table 'mysql.slow_log' doesn't exist
|
||||||
RENAME TABLE general_log2 TO general_log;
|
RENAME TABLE general_log2 TO general_log;
|
||||||
RENAME TABLE slow_log2 TO slow_log;
|
RENAME TABLE slow_log2 TO slow_log;
|
||||||
set global general_log='ON';
|
set global general_log='ON';
|
||||||
@ -355,3 +407,192 @@ SET SESSION long_query_time =@old_long_query_time;
|
|||||||
FLUSH LOGS;
|
FLUSH LOGS;
|
||||||
ALTER TABLE mysql.slow_log DROP COLUMN seq;
|
ALTER TABLE mysql.slow_log DROP COLUMN seq;
|
||||||
ALTER TABLE mysql.slow_log ENGINE = CSV;
|
ALTER TABLE mysql.slow_log ENGINE = CSV;
|
||||||
|
drop procedure if exists proc25422_truncate_slow;
|
||||||
|
drop procedure if exists proc25422_truncate_general;
|
||||||
|
drop procedure if exists proc25422_alter_slow;
|
||||||
|
drop procedure if exists proc25422_alter_general;
|
||||||
|
use test//
|
||||||
|
create procedure proc25422_truncate_slow (loops int)
|
||||||
|
begin
|
||||||
|
declare v1 int default 0;
|
||||||
|
while v1 < loops do
|
||||||
|
truncate mysql.slow_log;
|
||||||
|
set v1 = v1 + 1;
|
||||||
|
end while;
|
||||||
|
end//
|
||||||
|
create procedure proc25422_truncate_general (loops int)
|
||||||
|
begin
|
||||||
|
declare v1 int default 0;
|
||||||
|
while v1 < loops do
|
||||||
|
truncate mysql.general_log;
|
||||||
|
set v1 = v1 + 1;
|
||||||
|
end while;
|
||||||
|
end//
|
||||||
|
create procedure proc25422_alter_slow (loops int)
|
||||||
|
begin
|
||||||
|
declare v1 int default 0;
|
||||||
|
declare ER_BAD_LOG_STATEMENT condition for 1575;
|
||||||
|
declare continue handler for ER_BAD_LOG_STATEMENT begin end;
|
||||||
|
while v1 < loops do
|
||||||
|
set @old_log_state = @@global.slow_query_log;
|
||||||
|
set global slow_query_log = 'OFF';
|
||||||
|
alter table mysql.slow_log engine = CSV;
|
||||||
|
set global slow_query_log = @old_log_state;
|
||||||
|
set v1 = v1 + 1;
|
||||||
|
end while;
|
||||||
|
end//
|
||||||
|
create procedure proc25422_alter_general (loops int)
|
||||||
|
begin
|
||||||
|
declare v1 int default 0;
|
||||||
|
declare ER_BAD_LOG_STATEMENT condition for 1575;
|
||||||
|
declare continue handler for ER_BAD_LOG_STATEMENT begin end;
|
||||||
|
while v1 < loops do
|
||||||
|
set @old_log_state = @@global.general_log;
|
||||||
|
set global general_log = 'OFF';
|
||||||
|
alter table mysql.general_log engine = CSV;
|
||||||
|
set global general_log = @old_log_state;
|
||||||
|
set v1 = v1 + 1;
|
||||||
|
end while;
|
||||||
|
end//
|
||||||
|
"Serial test (proc25422_truncate_slow)"
|
||||||
|
call proc25422_truncate_slow(100);
|
||||||
|
"Serial test (proc25422_truncate_general)"
|
||||||
|
call proc25422_truncate_general(100);
|
||||||
|
"Serial test (proc25422_alter_slow)"
|
||||||
|
call proc25422_alter_slow(100);
|
||||||
|
"Serial test (proc25422_alter_general)"
|
||||||
|
call proc25422_alter_general(100);
|
||||||
|
"Parallel test"
|
||||||
|
call proc25422_truncate_slow(100);
|
||||||
|
call proc25422_truncate_slow(100);
|
||||||
|
call proc25422_truncate_general(100);
|
||||||
|
call proc25422_truncate_general(100);
|
||||||
|
call proc25422_alter_slow(100);
|
||||||
|
call proc25422_alter_slow(100);
|
||||||
|
call proc25422_alter_general(100);
|
||||||
|
call proc25422_alter_general(100);
|
||||||
|
drop procedure proc25422_truncate_slow;
|
||||||
|
drop procedure proc25422_truncate_general;
|
||||||
|
drop procedure proc25422_alter_slow;
|
||||||
|
drop procedure proc25422_alter_general;
|
||||||
|
FLUSH TABLE mysql.general_log;
|
||||||
|
show warnings;
|
||||||
|
Level Code Message
|
||||||
|
FLUSH TABLE mysql.slow_log;
|
||||||
|
show warnings;
|
||||||
|
Level Code Message
|
||||||
|
DROP TABLE IF EXISTS `db_17876.slow_log_data`;
|
||||||
|
DROP TABLE IF EXISTS `db_17876.general_log_data`;
|
||||||
|
DROP PROCEDURE IF EXISTS `db_17876.archiveSlowLog`;
|
||||||
|
DROP PROCEDURE IF EXISTS `db_17876.archiveGeneralLog`;
|
||||||
|
DROP DATABASE IF EXISTS `db_17876`;
|
||||||
|
CREATE DATABASE db_17876;
|
||||||
|
CREATE TABLE `db_17876.slow_log_data` (
|
||||||
|
`start_time` timestamp default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
|
||||||
|
`user_host` mediumtext ,
|
||||||
|
`query_time` time ,
|
||||||
|
`lock_time` time ,
|
||||||
|
`rows_sent` int(11) ,
|
||||||
|
`rows_examined` int(11) ,
|
||||||
|
`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
|
||||||
|
);
|
||||||
|
CREATE TABLE `db_17876.general_log_data` (
|
||||||
|
`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
|
||||||
|
);
|
||||||
|
CREATE procedure `db_17876.archiveSlowLog`()
|
||||||
|
BEGIN
|
||||||
|
DECLARE start_time, query_time, lock_time CHAR(20);
|
||||||
|
DECLARE user_host MEDIUMTEXT;
|
||||||
|
DECLARE rows_set, rows_examined, last_insert_id, insert_id, server_id INT;
|
||||||
|
DECLARE dbname MEDIUMTEXT;
|
||||||
|
DECLARE sql_text BLOB;
|
||||||
|
DECLARE done INT DEFAULT 0;
|
||||||
|
DECLARE ER_SP_FETCH_NO_DATA CONDITION for 1329;
|
||||||
|
DECLARE cur1 CURSOR FOR SELECT * FROM mysql.slow_log;
|
||||||
|
OPEN cur1;
|
||||||
|
REPEAT
|
||||||
|
BEGIN
|
||||||
|
BEGIN
|
||||||
|
DECLARE CONTINUE HANDLER FOR ER_SP_FETCH_NO_DATA SET done = 1;
|
||||||
|
FETCH cur1 INTO
|
||||||
|
start_time, user_host, query_time, lock_time,
|
||||||
|
rows_set, rows_examined, dbname, last_insert_id,
|
||||||
|
insert_id, server_id, sql_text;
|
||||||
|
END;
|
||||||
|
IF NOT done THEN
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO
|
||||||
|
`db_17876.slow_log_data`
|
||||||
|
VALUES(start_time, user_host, query_time, lock_time, rows_set, rows_examined,
|
||||||
|
dbname, last_insert_id, insert_id, server_id, sql_text);
|
||||||
|
END;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
UNTIL done END REPEAT;
|
||||||
|
CLOSE cur1;
|
||||||
|
TRUNCATE mysql.slow_log;
|
||||||
|
END //
|
||||||
|
CREATE procedure `db_17876.archiveGeneralLog`()
|
||||||
|
BEGIN
|
||||||
|
DECLARE event_time CHAR(20);
|
||||||
|
DECLARE user_host, argument MEDIUMTEXT;
|
||||||
|
DECLARE thread_id, server_id INT;
|
||||||
|
DECLARE sql_text BLOB;
|
||||||
|
DECLARE done INT DEFAULT 0;
|
||||||
|
DECLARE command_type VARCHAR(64);
|
||||||
|
DECLARE ER_SP_FETCH_NO_DATA CONDITION for 1329;
|
||||||
|
DECLARE cur1 CURSOR FOR SELECT * FROM mysql.general_log;
|
||||||
|
OPEN cur1;
|
||||||
|
REPEAT
|
||||||
|
BEGIN
|
||||||
|
BEGIN
|
||||||
|
DECLARE CONTINUE HANDLER FOR ER_SP_FETCH_NO_DATA SET done = 1;
|
||||||
|
FETCH cur1 INTO
|
||||||
|
event_time, user_host, thread_id, server_id,
|
||||||
|
command_type, argument;
|
||||||
|
END;
|
||||||
|
IF NOT done THEN
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO
|
||||||
|
`db_17876.general_log_data`
|
||||||
|
VALUES(event_time, user_host, thread_id, server_id,
|
||||||
|
command_type, argument);
|
||||||
|
END;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
UNTIL done END REPEAT;
|
||||||
|
CLOSE cur1;
|
||||||
|
TRUNCATE mysql.general_log;
|
||||||
|
END //
|
||||||
|
SET @old_general_log_state = @@global.general_log;
|
||||||
|
SET @old_slow_log_state = @@global.slow_query_log;
|
||||||
|
SET GLOBAL general_log = ON;
|
||||||
|
SET GLOBAL slow_query_log = ON;
|
||||||
|
select "put something into general_log";
|
||||||
|
put something into general_log
|
||||||
|
put something into general_log
|
||||||
|
select "... and something more ...";
|
||||||
|
... and something more ...
|
||||||
|
... and something more ...
|
||||||
|
call `db_17876.archiveSlowLog`();
|
||||||
|
call `db_17876.archiveGeneralLog`();
|
||||||
|
SET GLOBAL general_log = OFF;
|
||||||
|
SET GLOBAL slow_query_log = OFF;
|
||||||
|
call `db_17876.archiveSlowLog`();
|
||||||
|
call `db_17876.archiveGeneralLog`();
|
||||||
|
DROP TABLE `db_17876.slow_log_data`;
|
||||||
|
DROP TABLE `db_17876.general_log_data`;
|
||||||
|
DROP PROCEDURE IF EXISTS `db_17876.archiveSlowLog`;
|
||||||
|
DROP PROCEDURE IF EXISTS `db_17876.archiveGeneralLog`;
|
||||||
|
DROP DATABASE IF EXISTS `db_17876`;
|
||||||
|
SET GLOBAL general_log = @old_general_log_state;
|
||||||
|
SET GLOBAL slow_query_log = @old_slow_log_state;
|
||||||
|
@ -93,55 +93,73 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
|
|||||||
|
|
||||||
USE `test`;
|
USE `test`;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`id` int(8) DEFAULT NULL,
|
`id` int(8) DEFAULT NULL,
|
||||||
`name` varchar(32) DEFAULT NULL
|
`name` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
INSERT DELAYED IGNORE INTO `t1` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
INSERT DELAYED IGNORE INTO `t1` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
||||||
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
|
||||||
DROP TABLE IF EXISTS `t2`;
|
DROP TABLE IF EXISTS `t2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t2` (
|
CREATE TABLE `t2` (
|
||||||
`id` int(8) DEFAULT NULL,
|
`id` int(8) DEFAULT NULL,
|
||||||
`name` varchar(32) DEFAULT NULL
|
`name` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
||||||
INSERT DELAYED IGNORE INTO `t2` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
INSERT DELAYED IGNORE INTO `t2` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
||||||
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
|
||||||
DROP TABLE IF EXISTS `t3`;
|
DROP TABLE IF EXISTS `t3`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t3` (
|
CREATE TABLE `t3` (
|
||||||
`id` int(8) DEFAULT NULL,
|
`id` int(8) DEFAULT NULL,
|
||||||
`name` varchar(32) DEFAULT NULL
|
`name` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
|
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
|
||||||
INSERT DELAYED IGNORE INTO `t3` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
INSERT DELAYED IGNORE INTO `t3` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
||||||
/*!40000 ALTER TABLE `t3` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `t3` ENABLE KEYS */;
|
||||||
DROP TABLE IF EXISTS `t4`;
|
DROP TABLE IF EXISTS `t4`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t4` (
|
CREATE TABLE `t4` (
|
||||||
`id` int(8) DEFAULT NULL,
|
`id` int(8) DEFAULT NULL,
|
||||||
`name` varchar(32) DEFAULT NULL
|
`name` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
|
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t4` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t4` DISABLE KEYS */;
|
||||||
INSERT DELAYED IGNORE INTO `t4` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
INSERT DELAYED IGNORE INTO `t4` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
||||||
/*!40000 ALTER TABLE `t4` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `t4` ENABLE KEYS */;
|
||||||
DROP TABLE IF EXISTS `t5`;
|
DROP TABLE IF EXISTS `t5`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t5` (
|
CREATE TABLE `t5` (
|
||||||
`id` int(8) DEFAULT NULL,
|
`id` int(8) DEFAULT NULL,
|
||||||
`name` varchar(32) DEFAULT NULL
|
`name` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
|
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t5` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t5` DISABLE KEYS */;
|
||||||
INSERT DELAYED IGNORE INTO `t5` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
INSERT DELAYED IGNORE INTO `t5` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
||||||
/*!40000 ALTER TABLE `t5` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `t5` ENABLE KEYS */;
|
||||||
DROP TABLE IF EXISTS `t6`;
|
DROP TABLE IF EXISTS `t6`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t6` (
|
CREATE TABLE `t6` (
|
||||||
`id` int(8) DEFAULT NULL,
|
`id` int(8) DEFAULT NULL,
|
||||||
`name` varchar(32) DEFAULT NULL
|
`name` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t6` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t6` DISABLE KEYS */;
|
||||||
INSERT IGNORE INTO `t6` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
INSERT IGNORE INTO `t6` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
||||||
@ -172,55 +190,73 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
|
|||||||
|
|
||||||
USE `test`;
|
USE `test`;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`id` int(8) DEFAULT NULL,
|
`id` int(8) DEFAULT NULL,
|
||||||
`name` varchar(32) DEFAULT NULL
|
`name` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
INSERT DELAYED INTO `t1` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
INSERT DELAYED INTO `t1` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
||||||
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
|
||||||
DROP TABLE IF EXISTS `t2`;
|
DROP TABLE IF EXISTS `t2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t2` (
|
CREATE TABLE `t2` (
|
||||||
`id` int(8) DEFAULT NULL,
|
`id` int(8) DEFAULT NULL,
|
||||||
`name` varchar(32) DEFAULT NULL
|
`name` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
||||||
INSERT DELAYED INTO `t2` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
INSERT DELAYED INTO `t2` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
||||||
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
|
||||||
DROP TABLE IF EXISTS `t3`;
|
DROP TABLE IF EXISTS `t3`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t3` (
|
CREATE TABLE `t3` (
|
||||||
`id` int(8) DEFAULT NULL,
|
`id` int(8) DEFAULT NULL,
|
||||||
`name` varchar(32) DEFAULT NULL
|
`name` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
|
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
|
||||||
INSERT DELAYED INTO `t3` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
INSERT DELAYED INTO `t3` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
||||||
/*!40000 ALTER TABLE `t3` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `t3` ENABLE KEYS */;
|
||||||
DROP TABLE IF EXISTS `t4`;
|
DROP TABLE IF EXISTS `t4`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t4` (
|
CREATE TABLE `t4` (
|
||||||
`id` int(8) DEFAULT NULL,
|
`id` int(8) DEFAULT NULL,
|
||||||
`name` varchar(32) DEFAULT NULL
|
`name` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
|
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t4` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t4` DISABLE KEYS */;
|
||||||
INSERT DELAYED INTO `t4` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
INSERT DELAYED INTO `t4` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
||||||
/*!40000 ALTER TABLE `t4` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `t4` ENABLE KEYS */;
|
||||||
DROP TABLE IF EXISTS `t5`;
|
DROP TABLE IF EXISTS `t5`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t5` (
|
CREATE TABLE `t5` (
|
||||||
`id` int(8) DEFAULT NULL,
|
`id` int(8) DEFAULT NULL,
|
||||||
`name` varchar(32) DEFAULT NULL
|
`name` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
|
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t5` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t5` DISABLE KEYS */;
|
||||||
INSERT DELAYED INTO `t5` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
INSERT DELAYED INTO `t5` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
||||||
/*!40000 ALTER TABLE `t5` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `t5` ENABLE KEYS */;
|
||||||
DROP TABLE IF EXISTS `t6`;
|
DROP TABLE IF EXISTS `t6`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t6` (
|
CREATE TABLE `t6` (
|
||||||
`id` int(8) DEFAULT NULL,
|
`id` int(8) DEFAULT NULL,
|
||||||
`name` varchar(32) DEFAULT NULL
|
`name` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t6` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t6` DISABLE KEYS */;
|
||||||
INSERT INTO `t6` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
INSERT INTO `t6` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
|
||||||
|
@ -29,9 +29,12 @@ DROP TABLE t1;
|
|||||||
CREATE TABLE t1 (a decimal(64, 20));
|
CREATE TABLE t1 (a decimal(64, 20));
|
||||||
INSERT INTO t1 VALUES ("1234567890123456789012345678901234567890"),
|
INSERT INTO t1 VALUES ("1234567890123456789012345678901234567890"),
|
||||||
("0987654321098765432109876543210987654321");
|
("0987654321098765432109876543210987654321");
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` decimal(64,20) DEFAULT NULL
|
`a` decimal(64,20) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
INSERT INTO `t1` VALUES ('1234567890123456789012345678901234567890.00000000000000000000'),('987654321098765432109876543210987654321.00000000000000000000');
|
INSERT INTO `t1` VALUES ('1234567890123456789012345678901234567890.00000000000000000000'),('987654321098765432109876543210987654321.00000000000000000000');
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
@ -41,9 +44,12 @@ CREATE TABLE t1 (a double);
|
|||||||
INSERT INTO t1 VALUES ('-9e999999');
|
INSERT INTO t1 VALUES ('-9e999999');
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1264 Out of range value for column 'a' at row 1
|
Warning 1264 Out of range value for column 'a' at row 1
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` double DEFAULT NULL
|
`a` double DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
INSERT INTO `t1` VALUES (RES);
|
INSERT INTO `t1` VALUES (RES);
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
@ -59,15 +65,21 @@ INSERT INTO t1 VALUES ('1.2345', 2.3456);
|
|||||||
INSERT INTO t1 VALUES ("1.2345", 2.3456);
|
INSERT INTO t1 VALUES ("1.2345", 2.3456);
|
||||||
ERROR 42S22: Unknown column '1.2345' in 'field list'
|
ERROR 42S22: Unknown column '1.2345' in 'field list'
|
||||||
SET SQL_MODE=@OLD_SQL_MODE;
|
SET SQL_MODE=@OLD_SQL_MODE;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` decimal(10,5) DEFAULT NULL,
|
`a` decimal(10,5) DEFAULT NULL,
|
||||||
`b` float DEFAULT NULL
|
`b` float DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
INSERT INTO `t1` VALUES ('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456);
|
INSERT INTO `t1` VALUES ('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456);
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` decimal(10,5) DEFAULT NULL,
|
`a` decimal(10,5) DEFAULT NULL,
|
||||||
`b` float DEFAULT NULL
|
`b` float DEFAULT NULL
|
||||||
);
|
);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
INSERT INTO `t1` VALUES ('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456);
|
INSERT INTO `t1` VALUES ('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456);
|
||||||
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||||
@ -81,10 +93,13 @@ INSERT INTO `t1` VALUES ('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456)
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` decimal(10,5) DEFAULT NULL,
|
`a` decimal(10,5) DEFAULT NULL,
|
||||||
`b` float DEFAULT NULL
|
`b` float DEFAULT NULL
|
||||||
);
|
);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -107,10 +122,13 @@ UNLOCK TABLES;
|
|||||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` decimal(10,5) DEFAULT NULL,
|
`a` decimal(10,5) DEFAULT NULL,
|
||||||
`b` float DEFAULT NULL
|
`b` float DEFAULT NULL
|
||||||
);
|
);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
INSERT INTO `t1` VALUES ('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456);
|
INSERT INTO `t1` VALUES ('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456),('1.23450',2.3456);
|
||||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||||
@ -186,9 +204,12 @@ INSERT INTO t1 VALUES (_koi8r x'C1C2C3C4C5'), (NULL);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` varchar(255) DEFAULT NULL
|
`a` varchar(255) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=koi8r;
|
) ENGINE=MyISAM DEFAULT CHARSET=koi8r;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -219,9 +240,12 @@ INSERT INTO t1 VALUES (1), (2);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL40' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL40' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) TYPE=MyISAM;
|
) TYPE=MyISAM;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -242,9 +266,12 @@ UNLOCK TABLES;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) TYPE=MyISAM;
|
) TYPE=MyISAM;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -263,9 +290,12 @@ DROP TABLE t1;
|
|||||||
# Bug #2592 'mysqldump doesn't quote "tricky" names correctly'
|
# Bug #2592 'mysqldump doesn't quote "tricky" names correctly'
|
||||||
#
|
#
|
||||||
create table ```a` (i int);
|
create table ```a` (i int);
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE ```a` (
|
CREATE TABLE ```a` (
|
||||||
`i` int(11) DEFAULT NULL
|
`i` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
drop table ```a`;
|
drop table ```a`;
|
||||||
#
|
#
|
||||||
# Bug #2591 "mysqldump quotes names inconsistently"
|
# Bug #2591 "mysqldump quotes names inconsistently"
|
||||||
@ -283,9 +313,12 @@ create table t1(a int);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -308,9 +341,12 @@ UNLOCK TABLES;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS "t1";
|
DROP TABLE IF EXISTS "t1";
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE "t1" (
|
CREATE TABLE "t1" (
|
||||||
"a" int(11) DEFAULT NULL
|
"a" int(11) DEFAULT NULL
|
||||||
);
|
);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES "t1" WRITE;
|
LOCK TABLES "t1" WRITE;
|
||||||
/*!40000 ALTER TABLE "t1" DISABLE KEYS */;
|
/*!40000 ALTER TABLE "t1" DISABLE KEYS */;
|
||||||
@ -336,9 +372,12 @@ set global sql_mode='ANSI_QUOTES';
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -361,9 +400,12 @@ UNLOCK TABLES;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS "t1";
|
DROP TABLE IF EXISTS "t1";
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE "t1" (
|
CREATE TABLE "t1" (
|
||||||
"a" int(11) DEFAULT NULL
|
"a" int(11) DEFAULT NULL
|
||||||
);
|
);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES "t1" WRITE;
|
LOCK TABLES "t1" WRITE;
|
||||||
/*!40000 ALTER TABLE "t1" DISABLE KEYS */;
|
/*!40000 ALTER TABLE "t1" DISABLE KEYS */;
|
||||||
@ -393,9 +435,12 @@ insert into t1 values (1),(2),(3);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||||
|
|
||||||
@ -484,9 +529,12 @@ INSERT INTO t1 VALUES (_latin1 '
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` char(10) DEFAULT NULL
|
`a` char(10) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -517,9 +565,12 @@ UNLOCK TABLES;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` char(10) DEFAULT NULL
|
`a` char(10) DEFAULT NULL
|
||||||
) TYPE=MyISAM;
|
) TYPE=MyISAM;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -540,9 +591,12 @@ UNLOCK TABLES;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` char(10) DEFAULT NULL
|
`a` char(10) DEFAULT NULL
|
||||||
) TYPE=MyISAM;
|
) TYPE=MyISAM;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -563,9 +617,12 @@ UNLOCK TABLES;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,MYSQL323' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` char(10) DEFAULT NULL
|
`a` char(10) DEFAULT NULL
|
||||||
) TYPE=MyISAM;
|
) TYPE=MyISAM;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -599,9 +656,12 @@ INSERT INTO t2 VALUES (4),(5),(6);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t2`;
|
DROP TABLE IF EXISTS `t2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t2` (
|
CREATE TABLE `t2` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t2` WRITE;
|
LOCK TABLES `t2` WRITE;
|
||||||
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
||||||
@ -637,9 +697,12 @@ INSERT INTO `t1` VALUES (0x602010000280100005E71A);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`b` blob
|
`b` blob
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -675,9 +738,12 @@ INSERT INTO t1 VALUES (4),(5),(6);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -706,9 +772,12 @@ UNLOCK TABLES;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
INSERT DELAYED IGNORE INTO `t1` VALUES (1),(2),(3),(4),(5),(6);
|
INSERT DELAYED IGNORE INTO `t1` VALUES (1),(2),(3),(4),(5),(6);
|
||||||
@ -1072,6 +1141,8 @@ insert into t1 (F_8d3bba7425e7c98c50f52ca1b52d3735) values (1);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`F_c4ca4238a0b923820dcc509a6f75849b` int(11) DEFAULT NULL,
|
`F_c4ca4238a0b923820dcc509a6f75849b` int(11) DEFAULT NULL,
|
||||||
`F_c81e728d9d4c2f636f067f89cc14862c` int(11) DEFAULT NULL,
|
`F_c81e728d9d4c2f636f067f89cc14862c` int(11) DEFAULT NULL,
|
||||||
@ -1404,6 +1475,7 @@ CREATE TABLE `t1` (
|
|||||||
`F_6faa8040da20ef399b63a72d0e4ab575` int(11) DEFAULT NULL,
|
`F_6faa8040da20ef399b63a72d0e4ab575` int(11) DEFAULT NULL,
|
||||||
`F_fe73f687e5bc5280214e0486b273a5f9` int(11) DEFAULT NULL
|
`F_fe73f687e5bc5280214e0486b273a5f9` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -1444,9 +1516,12 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
|
|||||||
|
|
||||||
USE `test`;
|
USE `test`;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -1485,13 +1560,19 @@ INSERT INTO t2 VALUES (1), (2);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
DROP TABLE IF EXISTS `t2`;
|
DROP TABLE IF EXISTS `t2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t2` (
|
CREATE TABLE `t2` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||||
|
|
||||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||||
@ -1514,13 +1595,19 @@ CREATE TABLE `t2` (
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
DROP TABLE IF EXISTS `t2`;
|
DROP TABLE IF EXISTS `t2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t2` (
|
CREATE TABLE `t2` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||||
|
|
||||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||||
@ -1720,17 +1807,26 @@ create table t3(a int);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t3`;
|
DROP TABLE IF EXISTS `t3`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t3` (
|
CREATE TABLE `t3` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
DROP TABLE IF EXISTS `t2`;
|
DROP TABLE IF EXISTS `t2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t2` (
|
CREATE TABLE `t2` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||||
|
|
||||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||||
@ -1760,9 +1856,12 @@ mysqldump: Got error: 1064: You have an error in your SQL syntax; check the manu
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||||
|
|
||||||
@ -1793,12 +1892,15 @@ insert into t1 values (0815, 4711, 2006);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS "t1";
|
DROP TABLE IF EXISTS "t1";
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE "t1" (
|
CREATE TABLE "t1" (
|
||||||
"a b" int(11) NOT NULL DEFAULT '0',
|
"a b" int(11) NOT NULL DEFAULT '0',
|
||||||
"c""d" int(11) NOT NULL DEFAULT '0',
|
"c""d" int(11) NOT NULL DEFAULT '0',
|
||||||
"e`f" int(11) NOT NULL DEFAULT '0',
|
"e`f" int(11) NOT NULL DEFAULT '0',
|
||||||
PRIMARY KEY ("a b","c""d","e`f")
|
PRIMARY KEY ("a b","c""d","e`f")
|
||||||
);
|
);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES "t1" WRITE;
|
LOCK TABLES "t1" WRITE;
|
||||||
/*!40000 ALTER TABLE "t1" DISABLE KEYS */;
|
/*!40000 ALTER TABLE "t1" DISABLE KEYS */;
|
||||||
@ -1824,12 +1926,15 @@ UNLOCK TABLES;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a b` int(11) NOT NULL DEFAULT '0',
|
`a b` int(11) NOT NULL DEFAULT '0',
|
||||||
`c"d` int(11) NOT NULL DEFAULT '0',
|
`c"d` int(11) NOT NULL DEFAULT '0',
|
||||||
`e``f` int(11) NOT NULL DEFAULT '0',
|
`e``f` int(11) NOT NULL DEFAULT '0',
|
||||||
PRIMARY KEY (`a b`,`c"d`,`e``f`)
|
PRIMARY KEY (`a b`,`c"d`,`e``f`)
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -1875,10 +1980,13 @@ create view v2 as select * from t2 where a like 'a%' with check option;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t2`;
|
DROP TABLE IF EXISTS `t2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t2` (
|
CREATE TABLE `t2` (
|
||||||
`a` varchar(30) DEFAULT NULL,
|
`a` varchar(30) DEFAULT NULL,
|
||||||
KEY `a` (`a`(5))
|
KEY `a` (`a`(5))
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t2` WRITE;
|
LOCK TABLES `t2` WRITE;
|
||||||
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
||||||
@ -1887,9 +1995,12 @@ INSERT INTO `t2` VALUES ('alfred'),('angie'),('bingo'),('waffle'),('lemon');
|
|||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
DROP TABLE IF EXISTS `v2`;
|
DROP TABLE IF EXISTS `v2`;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v2`*/;
|
/*!50001 DROP VIEW IF EXISTS `v2`*/;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
/*!50001 CREATE TABLE `v2` (
|
/*!50001 CREATE TABLE `v2` (
|
||||||
`a` varchar(30)
|
`a` varchar(30)
|
||||||
) */;
|
) */;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
/*!50001 DROP TABLE `v2`*/;
|
/*!50001 DROP TABLE `v2`*/;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v2`*/;
|
/*!50001 DROP VIEW IF EXISTS `v2`*/;
|
||||||
/*!50001 SET @saved_cs_client = @@character_set_client */;
|
/*!50001 SET @saved_cs_client = @@character_set_client */;
|
||||||
@ -1968,9 +2079,12 @@ create view v1 as select * from t1;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -1978,9 +2092,12 @@ LOCK TABLES `t1` WRITE;
|
|||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
DROP TABLE IF EXISTS `v1`;
|
DROP TABLE IF EXISTS `v1`;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
/*!50001 CREATE TABLE `v1` (
|
/*!50001 CREATE TABLE `v1` (
|
||||||
`a` int(11)
|
`a` int(11)
|
||||||
) */;
|
) */;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
/*!50001 DROP TABLE `v1`*/;
|
/*!50001 DROP TABLE `v1`*/;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
||||||
/*!50001 SET @saved_cs_client = @@character_set_client */;
|
/*!50001 SET @saved_cs_client = @@character_set_client */;
|
||||||
@ -2034,10 +2151,13 @@ create view v2 as select * from t2 where a like 'a%' with check option;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t2`;
|
DROP TABLE IF EXISTS `t2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t2` (
|
CREATE TABLE `t2` (
|
||||||
`a` varchar(30) DEFAULT NULL,
|
`a` varchar(30) DEFAULT NULL,
|
||||||
KEY `a` (`a`(5))
|
KEY `a` (`a`(5))
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t2` WRITE;
|
LOCK TABLES `t2` WRITE;
|
||||||
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
||||||
@ -2046,9 +2166,12 @@ INSERT INTO `t2` VALUES ('alfred'),('angie'),('bingo'),('waffle'),('lemon');
|
|||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
DROP TABLE IF EXISTS `v2`;
|
DROP TABLE IF EXISTS `v2`;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v2`*/;
|
/*!50001 DROP VIEW IF EXISTS `v2`*/;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
/*!50001 CREATE TABLE `v2` (
|
/*!50001 CREATE TABLE `v2` (
|
||||||
`a` varchar(30)
|
`a` varchar(30)
|
||||||
) */;
|
) */;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
/*!50001 DROP TABLE `v2`*/;
|
/*!50001 DROP TABLE `v2`*/;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v2`*/;
|
/*!50001 DROP VIEW IF EXISTS `v2`*/;
|
||||||
/*!50001 SET @saved_cs_client = @@character_set_client */;
|
/*!50001 SET @saved_cs_client = @@character_set_client */;
|
||||||
@ -2095,9 +2218,12 @@ INSERT INTO t1 VALUES ('\'');
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` char(10) DEFAULT NULL
|
`a` char(10) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -2138,11 +2264,14 @@ select v3.a from v3, v1 where v1.a=v3.a and v3.b=3 limit 1;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL,
|
`a` int(11) DEFAULT NULL,
|
||||||
`b` int(11) DEFAULT NULL,
|
`b` int(11) DEFAULT NULL,
|
||||||
`c` varchar(30) DEFAULT NULL
|
`c` varchar(30) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -2151,23 +2280,32 @@ INSERT INTO `t1` VALUES (1,2,'one'),(2,4,'two'),(3,6,'three');
|
|||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
DROP TABLE IF EXISTS `v1`;
|
DROP TABLE IF EXISTS `v1`;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
/*!50001 CREATE TABLE `v1` (
|
/*!50001 CREATE TABLE `v1` (
|
||||||
`a` int(11),
|
`a` int(11),
|
||||||
`b` int(11),
|
`b` int(11),
|
||||||
`c` varchar(30)
|
`c` varchar(30)
|
||||||
) */;
|
) */;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
DROP TABLE IF EXISTS `v2`;
|
DROP TABLE IF EXISTS `v2`;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v2`*/;
|
/*!50001 DROP VIEW IF EXISTS `v2`*/;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
/*!50001 CREATE TABLE `v2` (
|
/*!50001 CREATE TABLE `v2` (
|
||||||
`a` int(11)
|
`a` int(11)
|
||||||
) */;
|
) */;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
DROP TABLE IF EXISTS `v3`;
|
DROP TABLE IF EXISTS `v3`;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v3`*/;
|
/*!50001 DROP VIEW IF EXISTS `v3`*/;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
/*!50001 CREATE TABLE `v3` (
|
/*!50001 CREATE TABLE `v3` (
|
||||||
`a` int(11),
|
`a` int(11),
|
||||||
`b` int(11),
|
`b` int(11),
|
||||||
`c` varchar(30)
|
`c` varchar(30)
|
||||||
) */;
|
) */;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
/*!50001 DROP TABLE `v1`*/;
|
/*!50001 DROP TABLE `v1`*/;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
||||||
/*!50001 SET @saved_cs_client = @@character_set_client */;
|
/*!50001 SET @saved_cs_client = @@character_set_client */;
|
||||||
@ -2285,10 +2423,13 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
|
|||||||
|
|
||||||
USE `test`;
|
USE `test`;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL,
|
`a` int(11) DEFAULT NULL,
|
||||||
`b` bigint(20) DEFAULT NULL
|
`b` bigint(20) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -2354,9 +2495,12 @@ DELIMITER ;
|
|||||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||||
DROP TABLE IF EXISTS `t2`;
|
DROP TABLE IF EXISTS `t2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t2` (
|
CREATE TABLE `t2` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t2` WRITE;
|
LOCK TABLES `t2` WRITE;
|
||||||
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
||||||
@ -2408,10 +2552,13 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
|
|||||||
|
|
||||||
USE `test`;
|
USE `test`;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL,
|
`a` int(11) DEFAULT NULL,
|
||||||
`b` bigint(20) DEFAULT NULL
|
`b` bigint(20) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -2419,9 +2566,12 @@ INSERT INTO `t1` VALUES (1,NULL),(2,NULL),(4,NULL),(11,NULL);
|
|||||||
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
DROP TABLE IF EXISTS `t2`;
|
DROP TABLE IF EXISTS `t2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t2` (
|
CREATE TABLE `t2` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t2` WRITE;
|
LOCK TABLES `t2` WRITE;
|
||||||
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
||||||
@ -2545,9 +2695,12 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
|
|||||||
|
|
||||||
USE `test`;
|
USE `test`;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`id` int(11) DEFAULT NULL
|
`id` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -2693,10 +2846,13 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
|
|||||||
|
|
||||||
USE `test`;
|
USE `test`;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
`d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
UNIQUE KEY `d` (`d`)
|
UNIQUE KEY `d` (`d`)
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -2727,10 +2883,13 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
|
|||||||
|
|
||||||
USE `test`;
|
USE `test`;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
`d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
UNIQUE KEY `d` (`d`)
|
UNIQUE KEY `d` (`d`)
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -2777,9 +2936,12 @@ a2
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS "t1 test";
|
DROP TABLE IF EXISTS "t1 test";
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE "t1 test" (
|
CREATE TABLE "t1 test" (
|
||||||
"a1" int(11) DEFAULT NULL
|
"a1" int(11) DEFAULT NULL
|
||||||
);
|
);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES "t1 test" WRITE;
|
LOCK TABLES "t1 test" WRITE;
|
||||||
/*!40000 ALTER TABLE "t1 test" DISABLE KEYS */;
|
/*!40000 ALTER TABLE "t1 test" DISABLE KEYS */;
|
||||||
@ -2803,9 +2965,12 @@ DELIMITER ;
|
|||||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||||
DROP TABLE IF EXISTS "t2 test";
|
DROP TABLE IF EXISTS "t2 test";
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE "t2 test" (
|
CREATE TABLE "t2 test" (
|
||||||
"a2" int(11) DEFAULT NULL
|
"a2" int(11) DEFAULT NULL
|
||||||
);
|
);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES "t2 test" WRITE;
|
LOCK TABLES "t2 test" WRITE;
|
||||||
/*!40000 ALTER TABLE "t2 test" DISABLE KEYS */;
|
/*!40000 ALTER TABLE "t2 test" DISABLE KEYS */;
|
||||||
@ -2854,11 +3019,14 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
|
|||||||
|
|
||||||
USE `test`;
|
USE `test`;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL,
|
`a` int(11) DEFAULT NULL,
|
||||||
`b` varchar(32) DEFAULT NULL,
|
`b` varchar(32) DEFAULT NULL,
|
||||||
`c` varchar(32) DEFAULT NULL
|
`c` varchar(32) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -2867,25 +3035,34 @@ INSERT INTO `t1` VALUES (1,'first value','xxxx'),(2,'second value','tttt'),(3,'t
|
|||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
DROP TABLE IF EXISTS `v0`;
|
DROP TABLE IF EXISTS `v0`;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v0`*/;
|
/*!50001 DROP VIEW IF EXISTS `v0`*/;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
/*!50001 CREATE TABLE `v0` (
|
/*!50001 CREATE TABLE `v0` (
|
||||||
`a` int(11),
|
`a` int(11),
|
||||||
`b` varchar(32),
|
`b` varchar(32),
|
||||||
`c` varchar(32)
|
`c` varchar(32)
|
||||||
) */;
|
) */;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
DROP TABLE IF EXISTS `v1`;
|
DROP TABLE IF EXISTS `v1`;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
/*!50001 CREATE TABLE `v1` (
|
/*!50001 CREATE TABLE `v1` (
|
||||||
`a` int(11),
|
`a` int(11),
|
||||||
`b` varchar(32),
|
`b` varchar(32),
|
||||||
`c` varchar(32)
|
`c` varchar(32)
|
||||||
) */;
|
) */;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
DROP TABLE IF EXISTS `v2`;
|
DROP TABLE IF EXISTS `v2`;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v2`*/;
|
/*!50001 DROP VIEW IF EXISTS `v2`*/;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
/*!50001 CREATE TABLE `v2` (
|
/*!50001 CREATE TABLE `v2` (
|
||||||
`a` int(11),
|
`a` int(11),
|
||||||
`b` varchar(32),
|
`b` varchar(32),
|
||||||
`c` varchar(32)
|
`c` varchar(32)
|
||||||
) */;
|
) */;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
USE `test`;
|
USE `test`;
|
||||||
/*!50001 DROP TABLE `v0`*/;
|
/*!50001 DROP TABLE `v0`*/;
|
||||||
@ -2973,9 +3150,12 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET l
|
|||||||
|
|
||||||
USE `test`;
|
USE `test`;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -3029,10 +3209,13 @@ insert into t1 values ('','');
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` binary(1) DEFAULT NULL,
|
`a` binary(1) DEFAULT NULL,
|
||||||
`b` blob
|
`b` blob
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -3061,10 +3244,13 @@ UNLOCK TABLES;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` binary(1) DEFAULT NULL,
|
`a` binary(1) DEFAULT NULL,
|
||||||
`b` blob
|
`b` blob
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -3237,9 +3423,12 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_test_db` /*!40100 DEFAULT CH
|
|||||||
|
|
||||||
USE `mysqldump_test_db`;
|
USE `mysqldump_test_db`;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`id` int(11) DEFAULT NULL
|
`id` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -3248,9 +3437,12 @@ INSERT INTO `t1` VALUES (1232131),(4711),(3231),(815);
|
|||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
DROP TABLE IF EXISTS `v1`;
|
DROP TABLE IF EXISTS `v1`;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
/*!50001 CREATE TABLE `v1` (
|
/*!50001 CREATE TABLE `v1` (
|
||||||
`id` int(11)
|
`id` int(11)
|
||||||
) */;
|
) */;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
USE `mysqldump_test_db`;
|
USE `mysqldump_test_db`;
|
||||||
/*!50001 DROP TABLE `v1`*/;
|
/*!50001 DROP TABLE `v1`*/;
|
||||||
@ -3293,18 +3485,24 @@ create view nasishnasifu as select mysqldump_tables.basetable.id from mysqldump_
|
|||||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_tables` /*!40100 DEFAULT CHARACTER SET latin1 */;
|
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_tables` /*!40100 DEFAULT CHARACTER SET latin1 */;
|
||||||
|
|
||||||
USE `mysqldump_tables`;
|
USE `mysqldump_tables`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `basetable` (
|
CREATE TABLE `basetable` (
|
||||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
`tag` varchar(64) DEFAULT NULL,
|
`tag` varchar(64) DEFAULT NULL,
|
||||||
UNIQUE KEY `id` (`id`)
|
UNIQUE KEY `id` (`id`)
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_views` /*!40100 DEFAULT CHARACTER SET latin1 */;
|
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_views` /*!40100 DEFAULT CHARACTER SET latin1 */;
|
||||||
|
|
||||||
USE `mysqldump_views`;
|
USE `mysqldump_views`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
/*!50001 CREATE TABLE `nasishnasifu` (
|
/*!50001 CREATE TABLE `nasishnasifu` (
|
||||||
`id` bigint(20) unsigned
|
`id` bigint(20) unsigned
|
||||||
) */;
|
) */;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
USE `mysqldump_tables`;
|
USE `mysqldump_tables`;
|
||||||
|
|
||||||
@ -3461,22 +3659,31 @@ CREATE TABLE t1 (a int) ENGINE=merge UNION=(t2, t3);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 UNION=(`t2`,`t3`);
|
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 UNION=(`t2`,`t3`);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
DROP TABLE IF EXISTS `t2`;
|
DROP TABLE IF EXISTS `t2`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t2` (
|
CREATE TABLE `t2` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t2` WRITE;
|
LOCK TABLES `t2` WRITE;
|
||||||
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
|
||||||
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
DROP TABLE IF EXISTS `t3`;
|
DROP TABLE IF EXISTS `t3`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t3` (
|
CREATE TABLE `t3` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t3` WRITE;
|
LOCK TABLES `t3` WRITE;
|
||||||
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
|
||||||
@ -3556,10 +3763,13 @@ drop database mysqldump_test_db;
|
|||||||
#
|
#
|
||||||
CREATE TABLE t1 (c1 INT, c2 LONGBLOB);
|
CREATE TABLE t1 (c1 INT, c2 LONGBLOB);
|
||||||
INSERT INTO t1 SET c1=11, c2=REPEAT('q',509);
|
INSERT INTO t1 SET c1=11, c2=REPEAT('q',509);
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`c1` int(11) DEFAULT NULL,
|
`c1` int(11) DEFAULT NULL,
|
||||||
`c2` longblob
|
`c2` longblob
|
||||||
);
|
);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
INSERT INTO `t1` VALUES (11,0x7171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171);
|
INSERT INTO `t1` VALUES (11,0x7171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171);
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
@ -3614,10 +3824,13 @@ INSERT INTO t1 VALUES (3,4), (4,5);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL,
|
`a` int(11) DEFAULT NULL,
|
||||||
`b` int(11) DEFAULT NULL
|
`b` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -3881,9 +4094,12 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_test_db` /*!40100 DEFAULT CH
|
|||||||
|
|
||||||
USE `mysqldump_test_db`;
|
USE `mysqldump_test_db`;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`id` int(11) DEFAULT NULL
|
`id` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -3892,9 +4108,12 @@ INSERT INTO `t1` VALUES (1232131),(4711),(3231),(815);
|
|||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
DROP TABLE IF EXISTS `v1`;
|
DROP TABLE IF EXISTS `v1`;
|
||||||
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
/*!50001 DROP VIEW IF EXISTS `v1`*/;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
/*!50001 CREATE TABLE `v1` (
|
/*!50001 CREATE TABLE `v1` (
|
||||||
`id` int(11)
|
`id` int(11)
|
||||||
) */;
|
) */;
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
USE `mysqldump_test_db`;
|
USE `mysqldump_test_db`;
|
||||||
/*!50001 DROP TABLE `v1`*/;
|
/*!50001 DROP TABLE `v1`*/;
|
||||||
@ -3925,5 +4144,38 @@ drop view v1;
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
drop database mysqldump_test_db;
|
drop database mysqldump_test_db;
|
||||||
#
|
#
|
||||||
|
# Bug #30027: mysqldump does not dump views properly.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Cleanup.
|
||||||
|
DROP DATABASE IF EXISTS mysqldump_test_db;
|
||||||
|
|
||||||
|
# Create objects.
|
||||||
|
CREATE DATABASE mysqldump_test_db;
|
||||||
|
set names koi8r;
|
||||||
|
CREATE VIEW mysqldump_test_db.v2 AS SELECT 1 AS ËÏÌÏÎËÁ1;
|
||||||
|
CREATE VIEW mysqldump_test_db.v1 AS SELECT ËÏÌÏÎËÁ1 FROM mysqldump_test_db.v2;
|
||||||
|
set names latin1;
|
||||||
|
|
||||||
|
# Dump mysqldump_test_db to bug30027.sql.
|
||||||
|
|
||||||
|
# Drop mysqldump_test_db.
|
||||||
|
DROP DATABASE mysqldump_test_db;
|
||||||
|
|
||||||
|
# Restore mysqldump_test_db from bug30027.sql.
|
||||||
|
|
||||||
|
# Check the view.
|
||||||
|
set names utf8;
|
||||||
|
SHOW CREATE VIEW mysqldump_test_db.v1;
|
||||||
|
View Create View character_set_client collation_connection
|
||||||
|
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `mysqldump_test_db`.`v1` AS select `v2`.`колонка1` AS `колонка1` from `mysqldump_test_db`.`v2` koi8r koi8r_general_ci
|
||||||
|
SHOW CREATE VIEW mysqldump_test_db.v2;
|
||||||
|
View Create View character_set_client collation_connection
|
||||||
|
v2 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `mysqldump_test_db`.`v2` AS select 1 AS `колонка1` koi8r koi8r_general_ci
|
||||||
|
set names latin1;
|
||||||
|
|
||||||
|
# Cleanup.
|
||||||
|
DROP DATABASE mysqldump_test_db;
|
||||||
|
#
|
||||||
# End of 5.1 tests
|
# End of 5.1 tests
|
||||||
#
|
#
|
||||||
|
@ -99,9 +99,12 @@ INSERT INTO t1 VALUES (1), (2);
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
);
|
);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -130,9 +133,12 @@ UNLOCK TABLES;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
);
|
);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
@ -161,9 +167,12 @@ UNLOCK TABLES;
|
|||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||||
DROP TABLE IF EXISTS `t1`;
|
DROP TABLE IF EXISTS `t1`;
|
||||||
|
SET @saved_cs_client = @@character_set_client;
|
||||||
|
SET character_set_client = utf8;
|
||||||
CREATE TABLE `t1` (
|
CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
);
|
);
|
||||||
|
SET character_set_client = @saved_cs_client;
|
||||||
|
|
||||||
LOCK TABLES `t1` WRITE;
|
LOCK TABLES `t1` WRITE;
|
||||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||||
|
@ -1850,61 +1850,57 @@ create procedure proc_1() flush tables;
|
|||||||
flush tables;
|
flush tables;
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
|
||||||
select Host, User from mysql.user limit 0;
|
select Host, User from mysql.user limit 0;
|
||||||
Host User
|
Host User
|
||||||
select Host, Db from mysql.host limit 0;
|
select Host, Db from mysql.host limit 0;
|
||||||
Host Db
|
Host Db
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
mysql slow_log 0 0
|
||||||
mysql host 0 0
|
mysql host 0 0
|
||||||
mysql user 0 0
|
mysql user 0 0
|
||||||
call proc_1();
|
call proc_1();
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
|
||||||
select Host, User from mysql.user limit 0;
|
select Host, User from mysql.user limit 0;
|
||||||
Host User
|
Host User
|
||||||
select Host, Db from mysql.host limit 0;
|
select Host, Db from mysql.host limit 0;
|
||||||
Host Db
|
Host Db
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
mysql slow_log 0 0
|
||||||
mysql host 0 0
|
mysql host 0 0
|
||||||
mysql user 0 0
|
mysql user 0 0
|
||||||
call proc_1();
|
call proc_1();
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
|
||||||
select Host, User from mysql.user limit 0;
|
select Host, User from mysql.user limit 0;
|
||||||
Host User
|
Host User
|
||||||
select Host, Db from mysql.host limit 0;
|
select Host, Db from mysql.host limit 0;
|
||||||
Host Db
|
Host Db
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
mysql slow_log 0 0
|
||||||
mysql host 0 0
|
mysql host 0 0
|
||||||
mysql user 0 0
|
mysql user 0 0
|
||||||
call proc_1();
|
call proc_1();
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
|
||||||
select Host, User from mysql.user limit 0;
|
select Host, User from mysql.user limit 0;
|
||||||
Host User
|
Host User
|
||||||
select Host, Db from mysql.host limit 0;
|
select Host, Db from mysql.host limit 0;
|
||||||
Host Db
|
Host Db
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
mysql slow_log 0 0
|
||||||
mysql host 0 0
|
mysql host 0 0
|
||||||
mysql user 0 0
|
mysql user 0 0
|
||||||
flush tables;
|
flush tables;
|
||||||
@ -1922,54 +1918,50 @@ select Host, Db from mysql.host limit 0;
|
|||||||
Host Db
|
Host Db
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
|
||||||
mysql slow_log 1 0
|
|
||||||
mysql host 0 0
|
|
||||||
mysql user 0 0
|
mysql user 0 0
|
||||||
|
mysql general_log 0 0
|
||||||
|
mysql host 0 0
|
||||||
prepare abc from "flush tables";
|
prepare abc from "flush tables";
|
||||||
execute abc;
|
execute abc;
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
|
||||||
select Host, User from mysql.user limit 0;
|
select Host, User from mysql.user limit 0;
|
||||||
Host User
|
Host User
|
||||||
select Host, Db from mysql.host limit 0;
|
select Host, Db from mysql.host limit 0;
|
||||||
Host Db
|
Host Db
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
mysql slow_log 0 0
|
||||||
mysql host 0 0
|
mysql host 0 0
|
||||||
mysql user 0 0
|
mysql user 0 0
|
||||||
execute abc;
|
execute abc;
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
|
||||||
select Host, User from mysql.user limit 0;
|
select Host, User from mysql.user limit 0;
|
||||||
Host User
|
Host User
|
||||||
select Host, Db from mysql.host limit 0;
|
select Host, Db from mysql.host limit 0;
|
||||||
Host Db
|
Host Db
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
mysql slow_log 0 0
|
||||||
mysql host 0 0
|
mysql host 0 0
|
||||||
mysql user 0 0
|
mysql user 0 0
|
||||||
execute abc;
|
execute abc;
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
|
||||||
select Host, User from mysql.user limit 0;
|
select Host, User from mysql.user limit 0;
|
||||||
Host User
|
Host User
|
||||||
select Host, Db from mysql.host limit 0;
|
select Host, Db from mysql.host limit 0;
|
||||||
Host Db
|
Host Db
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
mysql slow_log 0 0
|
||||||
mysql host 0 0
|
mysql host 0 0
|
||||||
mysql user 0 0
|
mysql user 0 0
|
||||||
flush tables;
|
flush tables;
|
||||||
|
@ -251,14 +251,13 @@ drop table t1;
|
|||||||
flush tables;
|
flush tables;
|
||||||
show open tables;
|
show open tables;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
|
||||||
create table t1(n int);
|
create table t1(n int);
|
||||||
insert into t1 values (1);
|
insert into t1 values (1);
|
||||||
show open tables;
|
show open tables;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
mysql slow_log 0 0
|
||||||
test t1 0 0
|
test t1 0 0
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (a int not null, b VARCHAR(10), INDEX (b) ) AVG_ROW_LENGTH=10 CHECKSUM=1 COMMENT="test" ENGINE=MYISAM MIN_ROWS=10 MAX_ROWS=100 PACK_KEYS=1 DELAY_KEY_WRITE=1 ROW_FORMAT=fixed;
|
create table t1 (a int not null, b VARCHAR(10), INDEX (b) ) AVG_ROW_LENGTH=10 CHECKSUM=1 COMMENT="test" ENGINE=MYISAM MIN_ROWS=10 MAX_ROWS=100 PACK_KEYS=1 DELAY_KEY_WRITE=1 ROW_FORMAT=fixed;
|
||||||
@ -672,24 +671,23 @@ SELECT 1 FROM mysql.db, mysql.proc, mysql.user, mysql.time_zone, mysql.time_zone
|
|||||||
1
|
1
|
||||||
SHOW OPEN TABLES;
|
SHOW OPEN TABLES;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql proc 0 0
|
mysql db 0 0
|
||||||
test urkunde 0 0
|
test urkunde 0 0
|
||||||
mysql time_zone 0 0
|
mysql time_zone 0 0
|
||||||
mysql db 0 0
|
mysql general_log 0 0
|
||||||
test txt1 0 0
|
test txt1 0 0
|
||||||
mysql slow_log 1 0
|
mysql proc 0 0
|
||||||
test tyt2 0 0
|
test tyt2 0 0
|
||||||
mysql general_log 1 0
|
|
||||||
mysql user 0 0
|
mysql user 0 0
|
||||||
mysql time_zone_name 0 0
|
mysql time_zone_name 0 0
|
||||||
SHOW OPEN TABLES FROM mysql;
|
SHOW OPEN TABLES FROM mysql;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql proc 0 0
|
|
||||||
mysql time_zone 0 0
|
|
||||||
mysql db 0 0
|
mysql db 0 0
|
||||||
mysql slow_log 1 0
|
mysql time_zone 0 0
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
|
mysql slow_log 0 0
|
||||||
mysql user 0 0
|
mysql user 0 0
|
||||||
|
mysql proc 0 0
|
||||||
mysql time_zone_name 0 0
|
mysql time_zone_name 0 0
|
||||||
SHOW OPEN TABLES FROM mysql LIKE 'u%';
|
SHOW OPEN TABLES FROM mysql LIKE 'u%';
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
@ -702,16 +700,15 @@ test tyt2 0 0
|
|||||||
mysql time_zone_name 0 0
|
mysql time_zone_name 0 0
|
||||||
SHOW OPEN TABLES LIKE '%o%';
|
SHOW OPEN TABLES LIKE '%o%';
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql proc 0 0
|
|
||||||
mysql time_zone 0 0
|
mysql time_zone 0 0
|
||||||
mysql slow_log 1 0
|
mysql general_log 0 0
|
||||||
mysql general_log 1 0
|
mysql slow_log 0 0
|
||||||
|
mysql proc 0 0
|
||||||
mysql time_zone_name 0 0
|
mysql time_zone_name 0 0
|
||||||
FLUSH TABLES;
|
FLUSH TABLES;
|
||||||
SHOW OPEN TABLES;
|
SHOW OPEN TABLES;
|
||||||
Database Table In_use Name_locked
|
Database Table In_use Name_locked
|
||||||
mysql general_log 1 0
|
mysql general_log 0 0
|
||||||
mysql slow_log 1 0
|
|
||||||
DROP TABLE txt1;
|
DROP TABLE txt1;
|
||||||
DROP TABLE tyt2;
|
DROP TABLE tyt2;
|
||||||
DROP TABLE urkunde;
|
DROP TABLE urkunde;
|
||||||
@ -1148,6 +1145,26 @@ DROP TABLE t1;
|
|||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
DROP FUNCTION f1;
|
DROP FUNCTION f1;
|
||||||
|
set names koi8r;
|
||||||
|
DROP DATABASE IF EXISTS mysqltest1;
|
||||||
|
CREATE DATABASE mysqltest1;
|
||||||
|
use mysqltest1;
|
||||||
|
CREATE TABLE t1(ËÏÌÏÎËÁ1 INT);
|
||||||
|
|
||||||
|
---> Dumping mysqltest1 to show_check.mysqltest1.sql
|
||||||
|
|
||||||
|
|
||||||
|
DROP DATABASE mysqltest1;
|
||||||
|
|
||||||
|
|
||||||
|
---> Restoring mysqltest1...
|
||||||
|
SHOW CREATE TABLE mysqltest1.t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`ËÏÌÏÎËÁ1` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP DATABASE mysqltest1;
|
||||||
|
use test;
|
||||||
flush status;
|
flush status;
|
||||||
show variables like "log_queries_not_using_indexes";
|
show variables like "log_queries_not_using_indexes";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
|
@ -289,4 +289,34 @@ create table t1 select f_bug22427() as i;
|
|||||||
ERROR 42S01: Table 't1' already exists
|
ERROR 42S01: Table 't1' already exists
|
||||||
drop table t1;
|
drop table t1;
|
||||||
drop function f_bug22427;
|
drop function f_bug22427;
|
||||||
|
#
|
||||||
|
# Bug #29929 LOCK TABLES does not pre-lock tables used in triggers of the locked tables
|
||||||
|
#
|
||||||
|
DROP table IF EXISTS t1,t2;
|
||||||
|
CREATE TABLE t1 (c1 INT);
|
||||||
|
CREATE TABLE t2 (c2 INT);
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
INSERT INTO t2 VALUES (2);
|
||||||
|
CREATE TRIGGER t1_ai AFTER INSERT ON t1 FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
UPDATE t2 SET c2= c2 + 1;
|
||||||
|
END//
|
||||||
|
# Take a table lock on t1.
|
||||||
|
# This should pre-lock t2 through the trigger.
|
||||||
|
LOCK TABLE t1 WRITE;
|
||||||
|
INSERT INTO t1 VALUES (3);
|
||||||
|
UNLOCK TABLES;
|
||||||
|
LOCK TABLE t1 READ;
|
||||||
|
INSERT INTO t2 values(4);
|
||||||
|
ERROR HY000: Table 't2' was not locked with LOCK TABLES
|
||||||
|
UNLOCK TABLES;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1
|
||||||
|
1
|
||||||
|
3
|
||||||
|
SELECT * FROM t2;
|
||||||
|
c2
|
||||||
|
3
|
||||||
|
DROP TRIGGER t1_ai;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
flush status;
|
flush status;
|
||||||
show status like 'Table_lock%';
|
show status like 'Table_lock%';
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Table_locks_immediate 0
|
Table_locks_immediate 1
|
||||||
Table_locks_waited 0
|
Table_locks_waited 0
|
||||||
select * from information_schema.session_status where variable_name like 'Table_lock%';
|
select * from information_schema.session_status where variable_name like 'Table_lock%';
|
||||||
VARIABLE_NAME VARIABLE_VALUE
|
VARIABLE_NAME VARIABLE_VALUE
|
||||||
TABLE_LOCKS_IMMEDIATE 0
|
TABLE_LOCKS_IMMEDIATE 2
|
||||||
TABLE_LOCKS_WAITED 0
|
TABLE_LOCKS_WAITED 0
|
||||||
SET SQL_LOG_BIN=0;
|
SET SQL_LOG_BIN=0;
|
||||||
drop table if exists t1;
|
drop table if exists t1;
|
||||||
@ -18,11 +18,11 @@ update t1 set n = 3;
|
|||||||
unlock tables;
|
unlock tables;
|
||||||
show status like 'Table_lock%';
|
show status like 'Table_lock%';
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Table_locks_immediate 3
|
Table_locks_immediate 17
|
||||||
Table_locks_waited 1
|
Table_locks_waited 1
|
||||||
select * from information_schema.session_status where variable_name like 'Table_lock%';
|
select * from information_schema.session_status where variable_name like 'Table_lock%';
|
||||||
VARIABLE_NAME VARIABLE_VALUE
|
VARIABLE_NAME VARIABLE_VALUE
|
||||||
TABLE_LOCKS_IMMEDIATE 3
|
TABLE_LOCKS_IMMEDIATE 18
|
||||||
TABLE_LOCKS_WAITED 1
|
TABLE_LOCKS_WAITED 1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
select 1;
|
select 1;
|
||||||
@ -97,7 +97,7 @@ Variable_name Value
|
|||||||
Com_show_status 3
|
Com_show_status 3
|
||||||
show status like 'hand%write%';
|
show status like 'hand%write%';
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_write 0
|
Handler_write 5
|
||||||
show status like '%tmp%';
|
show status like '%tmp%';
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Created_tmp_disk_tables 0
|
Created_tmp_disk_tables 0
|
||||||
@ -105,7 +105,7 @@ Created_tmp_files 0
|
|||||||
Created_tmp_tables 0
|
Created_tmp_tables 0
|
||||||
show status like 'hand%write%';
|
show status like 'hand%write%';
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_write 0
|
Handler_write 7
|
||||||
show status like '%tmp%';
|
show status like '%tmp%';
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Created_tmp_disk_tables 0
|
Created_tmp_disk_tables 0
|
||||||
|
@ -19,6 +19,7 @@ im_instance_conf : Bug#20294 2007-05-30 alik Instance manager tests
|
|||||||
im_life_cycle : BUG#27851 Instance manager dies on ASSERT in ~Thread_registry() or from not being able to close a mysqld instance.
|
im_life_cycle : BUG#27851 Instance manager dies on ASSERT in ~Thread_registry() or from not being able to close a mysqld instance.
|
||||||
im_instance_conf : BUG#28743 Instance manager generates warnings in test suite
|
im_instance_conf : BUG#28743 Instance manager generates warnings in test suite
|
||||||
im_utils : BUG#28743 Instance manager generates warnings in test suite
|
im_utils : BUG#28743 Instance manager generates warnings in test suite
|
||||||
|
|
||||||
concurrent_innodb : BUG#21579 2006-08-11 mleich innodb_concurrent random failures with varying differences
|
concurrent_innodb : BUG#21579 2006-08-11 mleich innodb_concurrent random failures with varying differences
|
||||||
ctype_big5 : BUG#26711 2007-06-21 Lars Test has never worked on Double Whopper
|
ctype_big5 : BUG#26711 2007-06-21 Lars Test has never worked on Double Whopper
|
||||||
|
|
||||||
|
@ -722,3 +722,18 @@ let $wait_condition=
|
|||||||
--source include/wait_condition.inc
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
DROP DATABASE events_test;
|
DROP DATABASE events_test;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#28641 CREATE EVENT with '2038.01.18 03:00:00' let server crash.
|
||||||
|
#
|
||||||
|
SET GLOBAL event_scheduler= ON;
|
||||||
|
DELIMITER |;
|
||||||
|
CREATE EVENT bug28641 ON SCHEDULE AT '2038.01.18 03:00:00'
|
||||||
|
DO BEGIN
|
||||||
|
SELECT 1;
|
||||||
|
END;|
|
||||||
|
|
||||||
|
DELIMITER ;|
|
||||||
|
SET GLOBAL event_scheduler= OFF;
|
||||||
|
DROP EVENT bug28641;
|
||||||
|
@ -126,6 +126,59 @@ drop table t1;
|
|||||||
--replace_column 1 TIMESTAMP 2 USER_HOST 3 #
|
--replace_column 1 TIMESTAMP 2 USER_HOST 3 #
|
||||||
select * from mysql.general_log;
|
select * from mysql.general_log;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#29129 (Resetting general_log while the GLOBAL READ LOCK is set causes
|
||||||
|
# a deadlock)
|
||||||
|
|
||||||
|
# save state
|
||||||
|
|
||||||
|
SET @old_general_log_state = @@global.general_log;
|
||||||
|
SET @old_slow_log_state = @@global.slow_query_log;
|
||||||
|
|
||||||
|
# Test ON->OFF transition under a GLOBAL READ LOCK
|
||||||
|
|
||||||
|
SET GLOBAL general_log = ON;
|
||||||
|
SET GLOBAL slow_query_log = ON;
|
||||||
|
|
||||||
|
FLUSH TABLES WITH READ LOCK;
|
||||||
|
|
||||||
|
SET GLOBAL general_log = OFF;
|
||||||
|
SET GLOBAL slow_query_log = OFF;
|
||||||
|
|
||||||
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
# Test OFF->ON transition under a GLOBAL READ LOCK
|
||||||
|
|
||||||
|
FLUSH TABLES WITH READ LOCK;
|
||||||
|
|
||||||
|
SET GLOBAL general_log = ON;
|
||||||
|
SET GLOBAL slow_query_log = ON;
|
||||||
|
|
||||||
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
# Test ON->OFF transition under a GLOBAL READ_ONLY
|
||||||
|
|
||||||
|
SET GLOBAL READ_ONLY = ON;
|
||||||
|
|
||||||
|
SET GLOBAL general_log = OFF;
|
||||||
|
SET GLOBAL slow_query_log = OFF;
|
||||||
|
|
||||||
|
SET GLOBAL READ_ONLY = OFF;
|
||||||
|
|
||||||
|
# Test OFF->ON transition under a GLOBAL READ_ONLY
|
||||||
|
|
||||||
|
SET GLOBAL READ_ONLY = ON;
|
||||||
|
|
||||||
|
SET GLOBAL general_log = ON;
|
||||||
|
SET GLOBAL slow_query_log = ON;
|
||||||
|
|
||||||
|
SET GLOBAL READ_ONLY = OFF;
|
||||||
|
|
||||||
|
# Restore state
|
||||||
|
|
||||||
|
SET GLOBAL general_log = @old_general_log_state;
|
||||||
|
SET GLOBAL slow_query_log = @old_slow_log_state;
|
||||||
|
|
||||||
--enable_ps_protocol
|
--enable_ps_protocol
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -64,10 +64,10 @@ flush logs;
|
|||||||
# check locking of the log tables
|
# check locking of the log tables
|
||||||
#
|
#
|
||||||
|
|
||||||
--error ER_CANT_WRITE_LOCK_LOG_TABLE
|
--error ER_CANT_LOCK_LOG_TABLE
|
||||||
lock tables mysql.general_log WRITE;
|
lock tables mysql.general_log WRITE;
|
||||||
|
|
||||||
--error ER_CANT_WRITE_LOCK_LOG_TABLE
|
--error ER_CANT_LOCK_LOG_TABLE
|
||||||
lock tables mysql.slow_log WRITE;
|
lock tables mysql.slow_log WRITE;
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -76,78 +76,59 @@ lock tables mysql.slow_log WRITE;
|
|||||||
# tables are always opened and locked by the logger.
|
# tables are always opened and locked by the logger.
|
||||||
#
|
#
|
||||||
|
|
||||||
--error ER_CANT_READ_LOCK_LOG_TABLE
|
--error ER_CANT_LOCK_LOG_TABLE
|
||||||
lock tables mysql.general_log READ;
|
lock tables mysql.general_log READ;
|
||||||
|
|
||||||
--error ER_CANT_READ_LOCK_LOG_TABLE
|
--error ER_CANT_LOCK_LOG_TABLE
|
||||||
lock tables mysql.slow_log READ;
|
lock tables mysql.slow_log READ;
|
||||||
|
|
||||||
#
|
#
|
||||||
# This call should result in TL_READ lock on the log table. This is ok and
|
# This call should result in TL_READ lock on the log table.
|
||||||
# should pass.
|
# This is not ok and should fail.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
--error ER_CANT_LOCK_LOG_TABLE
|
||||||
lock tables mysql.slow_log READ LOCAL, mysql.general_log READ LOCAL;
|
lock tables mysql.slow_log READ LOCAL, mysql.general_log READ LOCAL;
|
||||||
|
|
||||||
unlock tables;
|
# Misc locking tests
|
||||||
|
|
||||||
|
show create table mysql.general_log;
|
||||||
|
show fields from mysql.general_log;
|
||||||
|
|
||||||
|
show create table mysql.slow_log;
|
||||||
|
show fields from mysql.slow_log;
|
||||||
|
|
||||||
#
|
#
|
||||||
# check that FLUSH LOGS waits for all readers of the log table to vanish
|
# check that FLUSH LOGS does not flush the log tables
|
||||||
#
|
#
|
||||||
|
|
||||||
connect (con1,localhost,root,,);
|
flush logs;
|
||||||
connect (con2,localhost,root,,);
|
flush tables;
|
||||||
|
|
||||||
connection con1;
|
SET GLOBAL GENERAL_LOG=ON;
|
||||||
|
SET GLOBAL SLOW_QUERY_LOG=ON;
|
||||||
|
|
||||||
lock tables mysql.general_log READ LOCAL;
|
show open tables;
|
||||||
|
flush logs;
|
||||||
connection con2;
|
show open tables;
|
||||||
|
|
||||||
# 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
|
# check that FLUSH TABLES does flush the log tables
|
||||||
# to disappear
|
|
||||||
#
|
#
|
||||||
|
|
||||||
connection con1;
|
flush tables;
|
||||||
|
# Since the flush is logged, mysql.general_log will be in the cache
|
||||||
|
show open tables;
|
||||||
|
|
||||||
lock tables mysql.general_log READ LOCAL;
|
SET GLOBAL GENERAL_LOG=OFF;
|
||||||
|
SET GLOBAL SLOW_QUERY_LOG=OFF;
|
||||||
|
|
||||||
connection con2;
|
flush tables;
|
||||||
|
# Here the table cache is empty
|
||||||
|
show open tables;
|
||||||
|
|
||||||
# this should wait for log tables to unlock
|
SET GLOBAL GENERAL_LOG=ON;
|
||||||
send truncate mysql.general_log;
|
SET GLOBAL SLOW_QUERY_LOG=ON;
|
||||||
|
|
||||||
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
|
# Bug #16905 Log tables: unicode statements are logged incorrectly
|
||||||
@ -220,10 +201,10 @@ flush logs;
|
|||||||
|
|
||||||
# check locking of myisam-based log tables
|
# check locking of myisam-based log tables
|
||||||
|
|
||||||
--error ER_CANT_WRITE_LOCK_LOG_TABLE
|
--error ER_CANT_LOCK_LOG_TABLE
|
||||||
lock tables mysql.general_log WRITE;
|
lock tables mysql.general_log WRITE;
|
||||||
|
|
||||||
--error ER_CANT_WRITE_LOCK_LOG_TABLE
|
--error ER_CANT_LOCK_LOG_TABLE
|
||||||
lock tables mysql.slow_log WRITE;
|
lock tables mysql.slow_log WRITE;
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -232,21 +213,12 @@ lock tables mysql.slow_log WRITE;
|
|||||||
# tables are always opened and locked by the logger.
|
# tables are always opened and locked by the logger.
|
||||||
#
|
#
|
||||||
|
|
||||||
--error ER_CANT_READ_LOCK_LOG_TABLE
|
--error ER_CANT_LOCK_LOG_TABLE
|
||||||
lock tables mysql.general_log READ;
|
lock tables mysql.general_log READ;
|
||||||
|
|
||||||
--error ER_CANT_READ_LOCK_LOG_TABLE
|
--error ER_CANT_LOCK_LOG_TABLE
|
||||||
lock tables mysql.slow_log READ;
|
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
|
# check that we can drop them
|
||||||
set global general_log='OFF';
|
set global general_log='OFF';
|
||||||
set global slow_query_log='OFF';
|
set global slow_query_log='OFF';
|
||||||
@ -314,6 +286,7 @@ use test;
|
|||||||
flush tables with read lock;
|
flush tables with read lock;
|
||||||
unlock tables;
|
unlock tables;
|
||||||
use mysql;
|
use mysql;
|
||||||
|
--error ER_CANT_LOCK_LOG_TABLE
|
||||||
lock tables general_log read local, help_category read local;
|
lock tables general_log read local, help_category read local;
|
||||||
unlock tables;
|
unlock tables;
|
||||||
|
|
||||||
@ -368,9 +341,9 @@ set global slow_query_log='OFF';
|
|||||||
RENAME TABLE slow_log TO slow_log2;
|
RENAME TABLE slow_log TO slow_log2;
|
||||||
|
|
||||||
# this should fail
|
# this should fail
|
||||||
--error ER_CANT_ACTIVATE_LOG
|
--error ER_NO_SUCH_TABLE
|
||||||
set global general_log='ON';
|
set global general_log='ON';
|
||||||
--error ER_CANT_ACTIVATE_LOG
|
--error ER_NO_SUCH_TABLE
|
||||||
set global slow_query_log='ON';
|
set global slow_query_log='ON';
|
||||||
|
|
||||||
RENAME TABLE general_log2 TO general_log;
|
RENAME TABLE general_log2 TO general_log;
|
||||||
@ -470,8 +443,305 @@ FLUSH LOGS;
|
|||||||
ALTER TABLE mysql.slow_log DROP COLUMN seq;
|
ALTER TABLE mysql.slow_log DROP COLUMN seq;
|
||||||
ALTER TABLE mysql.slow_log ENGINE = CSV;
|
ALTER TABLE mysql.slow_log ENGINE = CSV;
|
||||||
|
|
||||||
# kill all connections
|
#
|
||||||
disconnect con1;
|
# Bug#25422 (Hang with log tables)
|
||||||
disconnect con2;
|
#
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
drop procedure if exists proc25422_truncate_slow;
|
||||||
|
drop procedure if exists proc25422_truncate_general;
|
||||||
|
drop procedure if exists proc25422_alter_slow;
|
||||||
|
drop procedure if exists proc25422_alter_general;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
delimiter //;
|
||||||
|
|
||||||
|
use test//
|
||||||
|
create procedure proc25422_truncate_slow (loops int)
|
||||||
|
begin
|
||||||
|
declare v1 int default 0;
|
||||||
|
while v1 < loops do
|
||||||
|
truncate mysql.slow_log;
|
||||||
|
set v1 = v1 + 1;
|
||||||
|
end while;
|
||||||
|
end//
|
||||||
|
|
||||||
|
create procedure proc25422_truncate_general (loops int)
|
||||||
|
begin
|
||||||
|
declare v1 int default 0;
|
||||||
|
while v1 < loops do
|
||||||
|
truncate mysql.general_log;
|
||||||
|
set v1 = v1 + 1;
|
||||||
|
end while;
|
||||||
|
end//
|
||||||
|
|
||||||
|
create procedure proc25422_alter_slow (loops int)
|
||||||
|
begin
|
||||||
|
declare v1 int default 0;
|
||||||
|
declare ER_BAD_LOG_STATEMENT condition for 1575;
|
||||||
|
declare continue handler for ER_BAD_LOG_STATEMENT begin end;
|
||||||
|
|
||||||
|
while v1 < loops do
|
||||||
|
set @old_log_state = @@global.slow_query_log;
|
||||||
|
set global slow_query_log = 'OFF';
|
||||||
|
alter table mysql.slow_log engine = CSV;
|
||||||
|
set global slow_query_log = @old_log_state;
|
||||||
|
set v1 = v1 + 1;
|
||||||
|
end while;
|
||||||
|
end//
|
||||||
|
|
||||||
|
create procedure proc25422_alter_general (loops int)
|
||||||
|
begin
|
||||||
|
declare v1 int default 0;
|
||||||
|
declare ER_BAD_LOG_STATEMENT condition for 1575;
|
||||||
|
declare continue handler for ER_BAD_LOG_STATEMENT begin end;
|
||||||
|
|
||||||
|
while v1 < loops do
|
||||||
|
set @old_log_state = @@global.general_log;
|
||||||
|
set global general_log = 'OFF';
|
||||||
|
alter table mysql.general_log engine = CSV;
|
||||||
|
set global general_log = @old_log_state;
|
||||||
|
set v1 = v1 + 1;
|
||||||
|
end while;
|
||||||
|
end//
|
||||||
|
|
||||||
|
delimiter ;//
|
||||||
|
|
||||||
|
--echo "Serial test (proc25422_truncate_slow)"
|
||||||
|
call proc25422_truncate_slow(100);
|
||||||
|
--echo "Serial test (proc25422_truncate_general)"
|
||||||
|
call proc25422_truncate_general(100);
|
||||||
|
--echo "Serial test (proc25422_alter_slow)"
|
||||||
|
call proc25422_alter_slow(100);
|
||||||
|
--echo "Serial test (proc25422_alter_general)"
|
||||||
|
call proc25422_alter_general(100);
|
||||||
|
|
||||||
|
--echo "Parallel test"
|
||||||
|
|
||||||
|
# ER_BAD_LOG_STATEMENT errors will occur,
|
||||||
|
# since concurrent threads do SET GLOBAL general_log= ...
|
||||||
|
# This is silenced by handlers and will not affect the test
|
||||||
|
|
||||||
|
connect (addconroot1, localhost, root,,);
|
||||||
|
connect (addconroot2, localhost, root,,);
|
||||||
|
connect (addconroot3, localhost, root,,);
|
||||||
|
connect (addconroot4, localhost, root,,);
|
||||||
|
connect (addconroot5, localhost, root,,);
|
||||||
|
connect (addconroot6, localhost, root,,);
|
||||||
|
connect (addconroot7, localhost, root,,);
|
||||||
|
connect (addconroot8, localhost, root,,);
|
||||||
|
|
||||||
|
connection addconroot1;
|
||||||
|
send call proc25422_truncate_slow(100);
|
||||||
|
connection addconroot2;
|
||||||
|
send call proc25422_truncate_slow(100);
|
||||||
|
|
||||||
|
connection addconroot3;
|
||||||
|
send call proc25422_truncate_general(100);
|
||||||
|
connection addconroot4;
|
||||||
|
send call proc25422_truncate_general(100);
|
||||||
|
|
||||||
|
connection addconroot5;
|
||||||
|
send call proc25422_alter_slow(100);
|
||||||
|
connection addconroot6;
|
||||||
|
send call proc25422_alter_slow(100);
|
||||||
|
|
||||||
|
connection addconroot7;
|
||||||
|
send call proc25422_alter_general(100);
|
||||||
|
connection addconroot8;
|
||||||
|
send call proc25422_alter_general(100);
|
||||||
|
|
||||||
|
connection addconroot1;
|
||||||
|
reap;
|
||||||
|
connection addconroot2;
|
||||||
|
reap;
|
||||||
|
connection addconroot3;
|
||||||
|
reap;
|
||||||
|
connection addconroot4;
|
||||||
|
reap;
|
||||||
|
connection addconroot5;
|
||||||
|
reap;
|
||||||
|
connection addconroot6;
|
||||||
|
reap;
|
||||||
|
connection addconroot7;
|
||||||
|
reap;
|
||||||
|
connection addconroot8;
|
||||||
|
reap;
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
|
||||||
|
disconnect addconroot1;
|
||||||
|
disconnect addconroot2;
|
||||||
|
disconnect addconroot3;
|
||||||
|
disconnect addconroot4;
|
||||||
|
disconnect addconroot5;
|
||||||
|
disconnect addconroot6;
|
||||||
|
disconnect addconroot7;
|
||||||
|
disconnect addconroot8;
|
||||||
|
|
||||||
|
drop procedure proc25422_truncate_slow;
|
||||||
|
drop procedure proc25422_truncate_general;
|
||||||
|
drop procedure proc25422_alter_slow;
|
||||||
|
drop procedure proc25422_alter_general;
|
||||||
|
|
||||||
--enable_ps_protocol
|
--enable_ps_protocol
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#23044 (Warnings on flush of a log table)
|
||||||
|
#
|
||||||
|
|
||||||
|
FLUSH TABLE mysql.general_log;
|
||||||
|
show warnings;
|
||||||
|
|
||||||
|
FLUSH TABLE mysql.slow_log;
|
||||||
|
show warnings;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#17876 (Truncating mysql.slow_log in a SP after using cursor locks the
|
||||||
|
# thread)
|
||||||
|
#
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS `db_17876.slow_log_data`;
|
||||||
|
DROP TABLE IF EXISTS `db_17876.general_log_data`;
|
||||||
|
DROP PROCEDURE IF EXISTS `db_17876.archiveSlowLog`;
|
||||||
|
DROP PROCEDURE IF EXISTS `db_17876.archiveGeneralLog`;
|
||||||
|
DROP DATABASE IF EXISTS `db_17876`;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
CREATE DATABASE db_17876;
|
||||||
|
|
||||||
|
CREATE TABLE `db_17876.slow_log_data` (
|
||||||
|
`start_time` timestamp default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
|
||||||
|
`user_host` mediumtext ,
|
||||||
|
`query_time` time ,
|
||||||
|
`lock_time` time ,
|
||||||
|
`rows_sent` int(11) ,
|
||||||
|
`rows_examined` int(11) ,
|
||||||
|
`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
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE `db_17876.general_log_data` (
|
||||||
|
`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
|
||||||
|
);
|
||||||
|
|
||||||
|
DELIMITER //;
|
||||||
|
|
||||||
|
CREATE procedure `db_17876.archiveSlowLog`()
|
||||||
|
BEGIN
|
||||||
|
DECLARE start_time, query_time, lock_time CHAR(20);
|
||||||
|
DECLARE user_host MEDIUMTEXT;
|
||||||
|
DECLARE rows_set, rows_examined, last_insert_id, insert_id, server_id INT;
|
||||||
|
DECLARE dbname MEDIUMTEXT;
|
||||||
|
DECLARE sql_text BLOB;
|
||||||
|
DECLARE done INT DEFAULT 0;
|
||||||
|
DECLARE ER_SP_FETCH_NO_DATA CONDITION for 1329;
|
||||||
|
|
||||||
|
DECLARE cur1 CURSOR FOR SELECT * FROM mysql.slow_log;
|
||||||
|
|
||||||
|
OPEN cur1;
|
||||||
|
|
||||||
|
REPEAT
|
||||||
|
BEGIN
|
||||||
|
BEGIN
|
||||||
|
DECLARE CONTINUE HANDLER FOR ER_SP_FETCH_NO_DATA SET done = 1;
|
||||||
|
|
||||||
|
FETCH cur1 INTO
|
||||||
|
start_time, user_host, query_time, lock_time,
|
||||||
|
rows_set, rows_examined, dbname, last_insert_id,
|
||||||
|
insert_id, server_id, sql_text;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF NOT done THEN
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO
|
||||||
|
`db_17876.slow_log_data`
|
||||||
|
VALUES(start_time, user_host, query_time, lock_time, rows_set, rows_examined,
|
||||||
|
dbname, last_insert_id, insert_id, server_id, sql_text);
|
||||||
|
END;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
UNTIL done END REPEAT;
|
||||||
|
|
||||||
|
CLOSE cur1;
|
||||||
|
TRUNCATE mysql.slow_log;
|
||||||
|
END //
|
||||||
|
|
||||||
|
CREATE procedure `db_17876.archiveGeneralLog`()
|
||||||
|
BEGIN
|
||||||
|
DECLARE event_time CHAR(20);
|
||||||
|
DECLARE user_host, argument MEDIUMTEXT;
|
||||||
|
DECLARE thread_id, server_id INT;
|
||||||
|
DECLARE sql_text BLOB;
|
||||||
|
DECLARE done INT DEFAULT 0;
|
||||||
|
DECLARE command_type VARCHAR(64);
|
||||||
|
DECLARE ER_SP_FETCH_NO_DATA CONDITION for 1329;
|
||||||
|
|
||||||
|
DECLARE cur1 CURSOR FOR SELECT * FROM mysql.general_log;
|
||||||
|
|
||||||
|
OPEN cur1;
|
||||||
|
|
||||||
|
REPEAT
|
||||||
|
BEGIN
|
||||||
|
BEGIN
|
||||||
|
DECLARE CONTINUE HANDLER FOR ER_SP_FETCH_NO_DATA SET done = 1;
|
||||||
|
|
||||||
|
FETCH cur1 INTO
|
||||||
|
event_time, user_host, thread_id, server_id,
|
||||||
|
command_type, argument;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF NOT done THEN
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO
|
||||||
|
`db_17876.general_log_data`
|
||||||
|
VALUES(event_time, user_host, thread_id, server_id,
|
||||||
|
command_type, argument);
|
||||||
|
END;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
UNTIL done END REPEAT;
|
||||||
|
|
||||||
|
CLOSE cur1;
|
||||||
|
TRUNCATE mysql.general_log;
|
||||||
|
END //
|
||||||
|
|
||||||
|
DELIMITER ;//
|
||||||
|
|
||||||
|
SET @old_general_log_state = @@global.general_log;
|
||||||
|
SET @old_slow_log_state = @@global.slow_query_log;
|
||||||
|
|
||||||
|
SET GLOBAL general_log = ON;
|
||||||
|
SET GLOBAL slow_query_log = ON;
|
||||||
|
|
||||||
|
select "put something into general_log";
|
||||||
|
select "... and something more ...";
|
||||||
|
|
||||||
|
call `db_17876.archiveSlowLog`();
|
||||||
|
call `db_17876.archiveGeneralLog`();
|
||||||
|
|
||||||
|
SET GLOBAL general_log = OFF;
|
||||||
|
SET GLOBAL slow_query_log = OFF;
|
||||||
|
|
||||||
|
call `db_17876.archiveSlowLog`();
|
||||||
|
call `db_17876.archiveGeneralLog`();
|
||||||
|
|
||||||
|
DROP TABLE `db_17876.slow_log_data`;
|
||||||
|
DROP TABLE `db_17876.general_log_data`;
|
||||||
|
DROP PROCEDURE IF EXISTS `db_17876.archiveSlowLog`;
|
||||||
|
DROP PROCEDURE IF EXISTS `db_17876.archiveGeneralLog`;
|
||||||
|
DROP DATABASE IF EXISTS `db_17876`;
|
||||||
|
|
||||||
|
SET GLOBAL general_log = @old_general_log_state;
|
||||||
|
SET GLOBAL slow_query_log = @old_slow_log_state;
|
||||||
|
|
||||||
|
@ -1698,6 +1698,63 @@ drop database mysqldump_test_db;
|
|||||||
--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug26121.sql
|
--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug26121.sql
|
||||||
--remove_file $MYSQLTEST_VARDIR/tmp/bug26121.sql
|
--remove_file $MYSQLTEST_VARDIR/tmp/bug26121.sql
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #30027: mysqldump does not dump views properly.
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # Cleanup.
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
DROP DATABASE IF EXISTS mysqldump_test_db;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # Create objects.
|
||||||
|
|
||||||
|
CREATE DATABASE mysqldump_test_db;
|
||||||
|
|
||||||
|
set names koi8r;
|
||||||
|
|
||||||
|
CREATE VIEW mysqldump_test_db.v2 AS SELECT 1 AS ËÏÌÏÎËÁ1;
|
||||||
|
CREATE VIEW mysqldump_test_db.v1 AS SELECT ËÏÌÏÎËÁ1 FROM mysqldump_test_db.v2;
|
||||||
|
|
||||||
|
set names latin1;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # Dump mysqldump_test_db to bug30027.sql.
|
||||||
|
|
||||||
|
--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --default-character-set=latin1 --databases mysqldump_test_db > $MYSQLTEST_VARDIR/tmp/bug30027.sql
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # Drop mysqldump_test_db.
|
||||||
|
|
||||||
|
DROP DATABASE mysqldump_test_db;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # Restore mysqldump_test_db from bug30027.sql.
|
||||||
|
|
||||||
|
--exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/bug30027.sql
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # Check the view.
|
||||||
|
|
||||||
|
set names utf8;
|
||||||
|
|
||||||
|
SHOW CREATE VIEW mysqldump_test_db.v1;
|
||||||
|
SHOW CREATE VIEW mysqldump_test_db.v2;
|
||||||
|
|
||||||
|
set names latin1;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # Cleanup.
|
||||||
|
|
||||||
|
DROP DATABASE mysqldump_test_db;
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 5.1 tests
|
--echo # End of 5.1 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -2018,10 +2018,17 @@ delimiter ;|
|
|||||||
select func_1(), func_1(), func_1() from dual;
|
select func_1(), func_1(), func_1() from dual;
|
||||||
drop function func_1;
|
drop function func_1;
|
||||||
drop procedure proc_1;
|
drop procedure proc_1;
|
||||||
|
|
||||||
|
# make the output deterministic:
|
||||||
|
# the order used in SHOW OPEN TABLES
|
||||||
|
# is too much implementation dependent
|
||||||
|
--disable_ps_protocol
|
||||||
flush tables;
|
flush tables;
|
||||||
select Host, User from mysql.user limit 0;
|
select Host, User from mysql.user limit 0;
|
||||||
select Host, Db from mysql.host limit 0;
|
select Host, Db from mysql.host limit 0;
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
|
--enable_ps_protocol
|
||||||
|
|
||||||
prepare abc from "flush tables";
|
prepare abc from "flush tables";
|
||||||
execute abc;
|
execute abc;
|
||||||
show open tables from mysql;
|
show open tables from mysql;
|
||||||
|
@ -438,6 +438,11 @@ drop table if exists t1;
|
|||||||
CREATE TABLE txt1(a int);
|
CREATE TABLE txt1(a int);
|
||||||
CREATE TABLE tyt2(a int);
|
CREATE TABLE tyt2(a int);
|
||||||
CREATE TABLE urkunde(a int);
|
CREATE TABLE urkunde(a int);
|
||||||
|
|
||||||
|
# make the output deterministic:
|
||||||
|
# the order used in SHOW OPEN TABLES
|
||||||
|
# is too much implementation dependent
|
||||||
|
--disable_ps_protocol
|
||||||
FLUSH TABLES;
|
FLUSH TABLES;
|
||||||
SELECT 1 FROM mysql.db, mysql.proc, mysql.user, mysql.time_zone, mysql.time_zone_name, txt1, tyt2, urkunde LIMIT 0;
|
SELECT 1 FROM mysql.db, mysql.proc, mysql.user, mysql.time_zone, mysql.time_zone_name, txt1, tyt2, urkunde LIMIT 0;
|
||||||
SHOW OPEN TABLES;
|
SHOW OPEN TABLES;
|
||||||
@ -447,6 +452,8 @@ SHOW OPEN TABLES LIKE 't%';
|
|||||||
SHOW OPEN TABLES LIKE '%o%';
|
SHOW OPEN TABLES LIKE '%o%';
|
||||||
FLUSH TABLES;
|
FLUSH TABLES;
|
||||||
SHOW OPEN TABLES;
|
SHOW OPEN TABLES;
|
||||||
|
--enable_ps_protocol
|
||||||
|
|
||||||
DROP TABLE txt1;
|
DROP TABLE txt1;
|
||||||
DROP TABLE tyt2;
|
DROP TABLE tyt2;
|
||||||
DROP TABLE urkunde;
|
DROP TABLE urkunde;
|
||||||
@ -554,6 +561,10 @@ show status like 'slow_queries';
|
|||||||
# FROM I_S.
|
# FROM I_S.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Part 1: check that meta-data specifies not-binary character set.
|
||||||
|
#
|
||||||
|
|
||||||
# Ensure that all needed objects are dropped.
|
# Ensure that all needed objects are dropped.
|
||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
@ -761,6 +772,59 @@ DROP VIEW v1;
|
|||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
DROP FUNCTION f1;
|
DROP FUNCTION f1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Part 2: check that table with non-latin1 characters are dumped/restored
|
||||||
|
# correctly.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Ensure that all needed objects are dropped.
|
||||||
|
|
||||||
|
set names koi8r;
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
DROP DATABASE IF EXISTS mysqltest1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
# Create objects.
|
||||||
|
|
||||||
|
CREATE DATABASE mysqltest1;
|
||||||
|
|
||||||
|
use mysqltest1;
|
||||||
|
|
||||||
|
CREATE TABLE t1(ËÏÌÏÎËÁ1 INT);
|
||||||
|
|
||||||
|
# Check:
|
||||||
|
# - Dump mysqltest1;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo ---> Dumping mysqltest1 to show_check.mysqltest1.sql
|
||||||
|
|
||||||
|
--exec $MYSQL_DUMP --default-character-set=latin1 --character-sets-dir=$CHARSETSDIR --databases mysqltest1 > $MYSQLTEST_VARDIR/tmp/show_check.mysqltest1.sql
|
||||||
|
|
||||||
|
# - Clean mysqltest1;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo
|
||||||
|
|
||||||
|
DROP DATABASE mysqltest1;
|
||||||
|
|
||||||
|
# - Restore mysqltest1;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo
|
||||||
|
|
||||||
|
--echo ---> Restoring mysqltest1...
|
||||||
|
--exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/show_check.mysqltest1.sql
|
||||||
|
|
||||||
|
# - Check definition of the table.
|
||||||
|
|
||||||
|
SHOW CREATE TABLE mysqltest1.t1;
|
||||||
|
|
||||||
|
# Cleanup.
|
||||||
|
|
||||||
|
DROP DATABASE mysqltest1;
|
||||||
|
use test;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug #28808: log_queries_not_using_indexes variable dynamic change is ignored
|
# Bug #28808: log_queries_not_using_indexes variable dynamic change is ignored
|
||||||
#
|
#
|
||||||
|
@ -356,4 +356,35 @@ create table t1 select f_bug22427() as i;
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
drop function f_bug22427;
|
drop function f_bug22427;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #29929 LOCK TABLES does not pre-lock tables used in triggers of the locked tables
|
||||||
|
--echo #
|
||||||
|
--disable_warnings
|
||||||
|
DROP table IF EXISTS t1,t2;
|
||||||
|
--enable_warnings
|
||||||
|
CREATE TABLE t1 (c1 INT);
|
||||||
|
CREATE TABLE t2 (c2 INT);
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
INSERT INTO t2 VALUES (2);
|
||||||
|
DELIMITER //;
|
||||||
|
CREATE TRIGGER t1_ai AFTER INSERT ON t1 FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
UPDATE t2 SET c2= c2 + 1;
|
||||||
|
END//
|
||||||
|
DELIMITER ;//
|
||||||
|
--echo # Take a table lock on t1.
|
||||||
|
--echo # This should pre-lock t2 through the trigger.
|
||||||
|
LOCK TABLE t1 WRITE;
|
||||||
|
INSERT INTO t1 VALUES (3);
|
||||||
|
UNLOCK TABLES;
|
||||||
|
LOCK TABLE t1 READ;
|
||||||
|
--error ER_TABLE_NOT_LOCKED
|
||||||
|
INSERT INTO t2 values(4);
|
||||||
|
UNLOCK TABLES;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SELECT * FROM t2;
|
||||||
|
DROP TRIGGER t1_ai;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
|
@ -63,16 +63,21 @@ CREATE TABLE IF NOT EXISTS proc (db char(64) collate utf8_bin DEFAULT '' NOT NUL
|
|||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS procs_priv ( Host char(60) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(16) binary DEFAULT '' NOT NULL, Routine_name char(64) binary DEFAULT '' NOT NULL, Routine_type enum('FUNCTION','PROCEDURE') NOT NULL, Grantor char(77) DEFAULT '' NOT NULL, Proc_priv set('Execute','Alter Routine','Grant') COLLATE utf8_general_ci DEFAULT '' NOT NULL, Timestamp timestamp(14), PRIMARY KEY (Host,Db,User,Routine_name,Routine_type), KEY Grantor (Grantor) ) engine=MyISAM CHARACTER SET utf8 COLLATE utf8_bin comment='Procedure privileges';
|
CREATE TABLE IF NOT EXISTS procs_priv ( Host char(60) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(16) binary DEFAULT '' NOT NULL, Routine_name char(64) binary DEFAULT '' NOT NULL, Routine_type enum('FUNCTION','PROCEDURE') NOT NULL, Grantor char(77) DEFAULT '' NOT NULL, Proc_priv set('Execute','Alter Routine','Grant') COLLATE utf8_general_ci DEFAULT '' NOT NULL, Timestamp timestamp(14), PRIMARY KEY (Host,Db,User,Routine_name,Routine_type), KEY Grantor (Grantor) ) engine=MyISAM CHARACTER SET utf8 COLLATE utf8_bin comment='Procedure privileges';
|
||||||
|
|
||||||
|
-- Create general_log if CSV is enabled.
|
||||||
|
|
||||||
delimiter ;;
|
SET @str = IF (@@have_csv = 'YES', 'CREATE TABLE IF NOT EXISTS general_log (event_time TIMESTAMP NOT NULL, user_host MEDIUMTEXT, thread_id INTEGER, server_id INTEGER, command_type VARCHAR(64), argument MEDIUMTEXT) engine=CSV CHARACTER SET utf8 comment="General log"', 'SET @dummy = 0');
|
||||||
CREATE PROCEDURE create_general_log_table() BEGIN DECLARE is_csv_enabled int DEFAULT 0; SELECT @@have_csv = 'YES' INTO is_csv_enabled; IF (is_csv_enabled) THEN CREATE TABLE IF NOT EXISTS general_log (event_time TIMESTAMP NOT NULL, user_host MEDIUMTEXT, thread_id INTEGER, server_id INTEGER, command_type VARCHAR(64), argument MEDIUMTEXT) engine=CSV CHARACTER SET utf8 comment='General log'; END IF; END;;
|
|
||||||
CALL create_general_log_table();;
|
|
||||||
DROP PROCEDURE create_general_log_table;;
|
|
||||||
|
|
||||||
CREATE PROCEDURE create_slow_log_table() BEGIN DECLARE is_csv_enabled int DEFAULT 0; SELECT @@have_csv = 'YES' INTO is_csv_enabled; IF (is_csv_enabled) THEN CREATE TABLE IF NOT EXISTS slow_log (start_time TIMESTAMP NOT NULL, user_host MEDIUMTEXT NOT NULL, query_time TIME NOT NULL, lock_time TIME NOT NULL, rows_sent INTEGER NOT NULL, rows_examined INTEGER NOT NULL, db VARCHAR(512), last_insert_id INTEGER, insert_id INTEGER, server_id INTEGER, sql_text MEDIUMTEXT NOT NULL) engine=CSV CHARACTER SET utf8 comment='Slow log'; END IF; END;;
|
PREPARE stmt FROM @str;
|
||||||
CALL create_slow_log_table();;
|
EXECUTE stmt;
|
||||||
DROP PROCEDURE create_slow_log_table;;
|
DROP PREPARE stmt;
|
||||||
delimiter ;
|
|
||||||
|
-- Create slow_log if CSV is enabled.
|
||||||
|
|
||||||
|
SET @str = IF (@@have_csv = 'YES', 'CREATE TABLE IF NOT EXISTS slow_log (start_time TIMESTAMP NOT NULL, user_host MEDIUMTEXT NOT NULL, query_time TIME NOT NULL, lock_time TIME NOT NULL, rows_sent INTEGER NOT NULL, rows_examined INTEGER NOT NULL, db VARCHAR(512), last_insert_id INTEGER, insert_id INTEGER, server_id INTEGER, sql_text MEDIUMTEXT NOT NULL) engine=CSV CHARACTER SET utf8 comment="Slow log"', 'SET @dummy = 0');
|
||||||
|
|
||||||
|
PREPARE stmt FROM @str;
|
||||||
|
EXECUTE stmt;
|
||||||
|
DROP PREPARE stmt;
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS event ( db char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', name char(64) CHARACTER SET utf8 NOT NULL default '', body longblob NOT NULL, definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', execute_at DATETIME default NULL, interval_value int(11) default NULL, interval_field ENUM('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') default NULL, created TIMESTAMP NOT NULL, modified TIMESTAMP NOT NULL, last_executed DATETIME default NULL, starts DATETIME default NULL, ends DATETIME default NULL, status ENUM('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL default 'ENABLED', on_completion ENUM('DROP','PRESERVE') NOT NULL default 'DROP', sql_mode set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE') DEFAULT '' NOT NULL, comment char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', originator int(10) NOT NULL, time_zone char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM', character_set_client char(32) collate utf8_bin, collation_connection char(32) collate utf8_bin, db_collation char(32) collate utf8_bin, body_utf8 longblob, PRIMARY KEY (db, name) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT 'Events';
|
CREATE TABLE IF NOT EXISTS event ( db char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', name char(64) CHARACTER SET utf8 NOT NULL default '', body longblob NOT NULL, definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', execute_at DATETIME default NULL, interval_value int(11) default NULL, interval_field ENUM('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') default NULL, created TIMESTAMP NOT NULL, modified TIMESTAMP NOT NULL, last_executed DATETIME default NULL, starts DATETIME default NULL, ends DATETIME default NULL, status ENUM('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL default 'ENABLED', on_completion ENUM('DROP','PRESERVE') NOT NULL default 'DROP', sql_mode set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE') DEFAULT '' NOT NULL, comment char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', originator int(10) NOT NULL, time_zone char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM', character_set_client char(32) collate utf8_bin, collation_connection char(32) collate utf8_bin, db_collation char(32) collate utf8_bin, body_utf8 longblob, PRIMARY KEY (db, name) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT 'Events';
|
||||||
|
|
||||||
|
@ -403,6 +403,8 @@ void Guardian::init()
|
|||||||
|
|
||||||
void Guardian::stop_instances()
|
void Guardian::stop_instances()
|
||||||
{
|
{
|
||||||
|
static const int NUM_STOP_ATTEMPTS = 100;
|
||||||
|
|
||||||
Instance_map::Iterator instances_it(instance_map);
|
Instance_map::Iterator instances_it(instance_map);
|
||||||
Instance *instance;
|
Instance *instance;
|
||||||
|
|
||||||
@ -438,7 +440,34 @@ void Guardian::stop_instances()
|
|||||||
|
|
||||||
/* Request mysqld to stop. */
|
/* Request mysqld to stop. */
|
||||||
|
|
||||||
instance->kill_mysqld(SIGTERM);
|
bool instance_stopped= FALSE;
|
||||||
|
|
||||||
|
for (int cur_attempt= 0; cur_attempt < NUM_STOP_ATTEMPTS; ++cur_attempt)
|
||||||
|
{
|
||||||
|
if (!instance->kill_mysqld(SIGTERM))
|
||||||
|
{
|
||||||
|
instance_stopped= TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!instance->is_active())
|
||||||
|
{
|
||||||
|
instance_stopped= TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sleep for 0.3 sec and check again. */
|
||||||
|
|
||||||
|
my_sleep(300000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Abort if we failed to stop mysqld instance. That should not happen,
|
||||||
|
but if it happened, we don't know what to do and prefer to have clear
|
||||||
|
failure with coredump.
|
||||||
|
*/
|
||||||
|
|
||||||
|
DBUG_ASSERT(instance_stopped);
|
||||||
|
|
||||||
instance->unlock();
|
instance->unlock();
|
||||||
}
|
}
|
||||||
|
@ -524,24 +524,17 @@ bool Instance::init(const LEX_STRING *name_arg)
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Complete instance options initialization.
|
@brief Complete instance options initialization.
|
||||||
|
|
||||||
SYNOPSIS
|
@return Error status.
|
||||||
complete_initialization()
|
@retval FALSE ok
|
||||||
|
@retval TRUE error
|
||||||
RETURN
|
|
||||||
FALSE - ok
|
|
||||||
TRUE - error
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool Instance::complete_initialization()
|
bool Instance::complete_initialization()
|
||||||
{
|
{
|
||||||
configured= ! options.complete_initialization();
|
configured= ! options.complete_initialization();
|
||||||
return FALSE;
|
return !configured;
|
||||||
/*
|
|
||||||
TODO: return actual status (from
|
|
||||||
Instance_options::complete_initialization()) here.
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
@ -644,25 +637,24 @@ bool Instance::is_mysqld_running()
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Start mysqld.
|
@brief Start mysqld.
|
||||||
|
|
||||||
SYNOPSIS
|
Reset flags and start Instance Monitor thread, which will start mysqld.
|
||||||
start_mysqld()
|
|
||||||
|
|
||||||
DESCRIPTION
|
@note Instance must be locked before calling the operation.
|
||||||
Reset flags and start Instance Monitor thread, which will start mysqld.
|
|
||||||
|
|
||||||
MT-NOTE: instance must be locked before calling the operation.
|
@return Error status code
|
||||||
|
@retval FALSE Ok
|
||||||
RETURN
|
@retval TRUE Could not start instance
|
||||||
FALSE - ok
|
|
||||||
TRUE - could not start instance
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool Instance::start_mysqld()
|
bool Instance::start_mysqld()
|
||||||
{
|
{
|
||||||
Instance_monitor *instance_monitor;
|
Instance_monitor *instance_monitor;
|
||||||
|
|
||||||
|
if (!configured)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Prepare instance to start Instance Monitor thread.
|
Prepare instance to start Instance Monitor thread.
|
||||||
|
|
||||||
@ -779,7 +771,7 @@ bool Instance::stop_mysqld()
|
|||||||
These operations should also be used in Guardian to manage instances.
|
These operations should also be used in Guardian to manage instances.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void Instance::kill_mysqld(int signum)
|
bool Instance::kill_mysqld(int signum)
|
||||||
{
|
{
|
||||||
pid_t mysqld_pid= options.load_pid();
|
pid_t mysqld_pid= options.load_pid();
|
||||||
|
|
||||||
@ -788,7 +780,7 @@ void Instance::kill_mysqld(int signum)
|
|||||||
log_info("Instance '%s': no pid file to send a signal (%d).",
|
log_info("Instance '%s': no pid file to send a signal (%d).",
|
||||||
(const char *) get_name()->str,
|
(const char *) get_name()->str,
|
||||||
(int) signum);
|
(int) signum);
|
||||||
return;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info("Instance '%s': sending %d to %d...",
|
log_info("Instance '%s': sending %d to %d...",
|
||||||
@ -800,7 +792,7 @@ void Instance::kill_mysqld(int signum)
|
|||||||
{
|
{
|
||||||
log_info("Instance '%s': kill() failed.",
|
log_info("Instance '%s': kill() failed.",
|
||||||
(const char *) get_name()->str);
|
(const char *) get_name()->str);
|
||||||
return;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Kill suceeded */
|
/* Kill suceeded */
|
||||||
@ -812,6 +804,8 @@ void Instance::kill_mysqld(int signum)
|
|||||||
/* After sucessful hard kill the pidfile need to be removed */
|
/* After sucessful hard kill the pidfile need to be removed */
|
||||||
options.unlink_pidfile();
|
options.unlink_pidfile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ public:
|
|||||||
|
|
||||||
bool start_mysqld();
|
bool start_mysqld();
|
||||||
bool stop_mysqld();
|
bool stop_mysqld();
|
||||||
void kill_mysqld(int signo);
|
bool kill_mysqld(int signo);
|
||||||
|
|
||||||
void lock();
|
void lock();
|
||||||
void unlock();
|
void unlock();
|
||||||
|
@ -156,7 +156,8 @@ int Instance_options::get_default_option(char *result, size_t result_len,
|
|||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
/* +2 eats first "--" from the option string (E.g. "--datadir") */
|
/* +2 eats first "--" from the option string (E.g. "--datadir") */
|
||||||
rc= parse_output_and_get_value((char*) cmd.buffer, option_name + 2,
|
rc= parse_output_and_get_value((char*) cmd.buffer,
|
||||||
|
option_name + 2, strlen(option_name + 2),
|
||||||
result, result_len, GET_VALUE);
|
result, result_len, GET_VALUE);
|
||||||
err:
|
err:
|
||||||
return rc;
|
return rc;
|
||||||
@ -194,8 +195,8 @@ bool Instance_options::fill_instance_version()
|
|||||||
|
|
||||||
bzero(result, MAX_VERSION_LENGTH);
|
bzero(result, MAX_VERSION_LENGTH);
|
||||||
|
|
||||||
if (parse_output_and_get_value((char*) cmd.buffer, "Ver", result,
|
if (parse_output_and_get_value((char*) cmd.buffer, STRING_WITH_LEN("Ver"),
|
||||||
MAX_VERSION_LENGTH, GET_LINE))
|
result, MAX_VERSION_LENGTH, GET_LINE))
|
||||||
{
|
{
|
||||||
log_error("Failed to get version of '%s': unexpected output.",
|
log_error("Failed to get version of '%s': unexpected output.",
|
||||||
(const char *) mysqld_path.str);
|
(const char *) mysqld_path.str);
|
||||||
@ -206,8 +207,7 @@ bool Instance_options::fill_instance_version()
|
|||||||
|
|
||||||
{
|
{
|
||||||
char *start;
|
char *start;
|
||||||
/* chop the newline from the end of the version string */
|
|
||||||
result[strlen(result) - NEWLINE_LEN]= '\0';
|
|
||||||
/* trim leading whitespaces */
|
/* trim leading whitespaces */
|
||||||
start= result;
|
start= result;
|
||||||
while (my_isspace(default_charset_info, *start))
|
while (my_isspace(default_charset_info, *start))
|
||||||
@ -255,7 +255,8 @@ bool Instance_options::fill_mysqld_real_path()
|
|||||||
|
|
||||||
bzero(result, FN_REFLEN);
|
bzero(result, FN_REFLEN);
|
||||||
|
|
||||||
if (parse_output_and_get_value((char*) cmd.buffer, "Usage: ",
|
if (parse_output_and_get_value((char*) cmd.buffer,
|
||||||
|
STRING_WITH_LEN("Usage: "),
|
||||||
result, FN_REFLEN,
|
result, FN_REFLEN,
|
||||||
GET_LINE))
|
GET_LINE))
|
||||||
{
|
{
|
||||||
|
@ -24,6 +24,13 @@
|
|||||||
#include "parse.h"
|
#include "parse.h"
|
||||||
#include "portability.h"
|
#include "portability.h"
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
Private module implementation.
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
namespace { /* no-indent */
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
void trim_space(const char **text, uint *word_len)
|
void trim_space(const char **text, uint *word_len)
|
||||||
{
|
{
|
||||||
@ -39,90 +46,362 @@ void trim_space(const char **text, uint *word_len)
|
|||||||
*word_len= (end - start)+1;
|
*word_len= (end - start)+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*************************************************************************/
|
||||||
Parse output of the given command
|
|
||||||
|
|
||||||
SYNOPSIS
|
/**
|
||||||
parse_output_and_get_value()
|
@brief A facade to the internal workings of optaining the output from an
|
||||||
|
executed system process.
|
||||||
command the command to execue with popen.
|
|
||||||
word the word to look for (usually an option name)
|
|
||||||
result the buffer to store the next word (option value)
|
|
||||||
input_buffer_len self-explanatory
|
|
||||||
flag this equals to GET_LINE if we want to get all the line after
|
|
||||||
the matched word and GET_VALUE otherwise.
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
|
|
||||||
Parse output of the "command". Find the "word" and return the next one
|
|
||||||
if flag is GET_VALUE. Return the rest of the parsed string otherwise.
|
|
||||||
|
|
||||||
RETURN
|
|
||||||
0 - ok, the word has been found
|
|
||||||
1 - error occured or the word is not found
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int parse_output_and_get_value(const char *command, const char *word,
|
class Mysqld_output_parser
|
||||||
char *result, size_t input_buffer_len,
|
{
|
||||||
uint flag)
|
public:
|
||||||
|
Mysqld_output_parser()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
virtual ~Mysqld_output_parser()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool parse(const char *command,
|
||||||
|
const char *option_name_str,
|
||||||
|
uint option_name_length,
|
||||||
|
char *option_value_buf,
|
||||||
|
size_t option_value_buf_size,
|
||||||
|
enum_option_type option_type);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
@brief Run a process and attach stdout- and stdin-pipes to it.
|
||||||
|
|
||||||
|
@param command The path to the process to be executed
|
||||||
|
|
||||||
|
@return Error status.
|
||||||
|
@retval TRUE An error occurred
|
||||||
|
@retval FALSE Operation was a success
|
||||||
|
*/
|
||||||
|
|
||||||
|
virtual bool run_command(const char *command)= 0;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Read a sequence of bytes from the executed process' stdout pipe.
|
||||||
|
|
||||||
|
The sequence is terminated by either '\0', LF or CRLF tokens. The
|
||||||
|
terminating token is excluded from the result.
|
||||||
|
|
||||||
|
@param line_buffer A pointer to a character buffer
|
||||||
|
@param line_buffer_size The size of the buffer in bytes
|
||||||
|
|
||||||
|
@return Error status.
|
||||||
|
@retval TRUE An error occured
|
||||||
|
@retval FALSE Operation was a success
|
||||||
|
*/
|
||||||
|
|
||||||
|
virtual bool read_line(char *line_buffer,
|
||||||
|
uint line_buffer_size)= 0;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Release any resources needed after a execution and parsing.
|
||||||
|
*/
|
||||||
|
|
||||||
|
virtual bool cleanup()= 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
|
bool Mysqld_output_parser::parse(const char *command,
|
||||||
|
const char *option_name_str,
|
||||||
|
uint option_name_length,
|
||||||
|
char *option_value_buf,
|
||||||
|
size_t option_value_buf_size,
|
||||||
|
enum_option_type option_type)
|
||||||
{
|
{
|
||||||
FILE *output;
|
|
||||||
uint wordlen;
|
|
||||||
/* should be enough to store the string from the output */
|
/* should be enough to store the string from the output */
|
||||||
enum { MAX_LINE_LEN= 512 };
|
const int LINE_BUFFER_SIZE= 512;
|
||||||
char linebuf[MAX_LINE_LEN];
|
char line_buffer[LINE_BUFFER_SIZE];
|
||||||
int rc= 1;
|
|
||||||
|
|
||||||
wordlen= strlen(word);
|
if (run_command(command))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
/*
|
while (true)
|
||||||
Successful return of popen does not tell us whether the command has been
|
|
||||||
executed successfully: if the command was not found, we'll get EOF
|
|
||||||
when reading the output buffer below.
|
|
||||||
*/
|
|
||||||
if (!(output= popen(command, "r")))
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
/*
|
|
||||||
We want fully buffered stream. We also want system to
|
|
||||||
allocate appropriate buffer.
|
|
||||||
*/
|
|
||||||
setvbuf(output, NULL, _IOFBF, 0);
|
|
||||||
|
|
||||||
while (fgets(linebuf, sizeof(linebuf) - 1, output))
|
|
||||||
{
|
{
|
||||||
uint found_word_len= 0;
|
if (read_line(line_buffer, LINE_BUFFER_SIZE))
|
||||||
char *linep= linebuf;
|
|
||||||
|
|
||||||
linebuf[sizeof(linebuf) - 1]= '\0'; /* safety */
|
|
||||||
|
|
||||||
/*
|
|
||||||
Find the word(s) we are looking for in the line
|
|
||||||
*/
|
|
||||||
if ((linep= strstr(linep, word)))
|
|
||||||
{
|
{
|
||||||
/*
|
cleanup();
|
||||||
If we have found our word(s), then move linep past the word(s)
|
return TRUE;
|
||||||
*/
|
}
|
||||||
linep+= wordlen;
|
|
||||||
if (flag & GET_VALUE)
|
uint found_word_len= 0;
|
||||||
|
char *linep= line_buffer;
|
||||||
|
|
||||||
|
line_buffer[sizeof(line_buffer) - 1]= '\0'; /* safety */
|
||||||
|
|
||||||
|
/* Find the word(s) we are looking for in the line. */
|
||||||
|
|
||||||
|
linep= strstr(linep, option_name_str);
|
||||||
|
|
||||||
|
if (!linep)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
linep+= option_name_length;
|
||||||
|
|
||||||
|
switch (option_type)
|
||||||
|
{
|
||||||
|
case GET_VALUE:
|
||||||
|
trim_space((const char**) &linep, &found_word_len);
|
||||||
|
|
||||||
|
if (option_value_buf_size <= found_word_len)
|
||||||
{
|
{
|
||||||
trim_space((const char**) &linep, &found_word_len);
|
cleanup();
|
||||||
if (input_buffer_len <= found_word_len)
|
return TRUE;
|
||||||
goto err;
|
|
||||||
strmake(result, linep, found_word_len);
|
|
||||||
}
|
}
|
||||||
else /* currently there are only two options */
|
|
||||||
strmake(result, linep, input_buffer_len - 1);
|
strmake(option_value_buf, linep, found_word_len);
|
||||||
rc= 0;
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GET_LINE:
|
||||||
|
strmake(option_value_buf, linep, option_value_buf_size - 1);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cleanup();
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we are not interested in the termination status */
|
|
||||||
pclose(output);
|
|
||||||
|
|
||||||
err:
|
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
Platform-specific implementation: UNIX.
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __WIN__
|
||||||
|
|
||||||
|
class Mysqld_output_parser_unix : public Mysqld_output_parser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Mysqld_output_parser_unix() :
|
||||||
|
m_stdout(NULL)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool run_command(const char *command);
|
||||||
|
|
||||||
|
virtual bool read_line(char *line_buffer,
|
||||||
|
uint line_buffer_size);
|
||||||
|
|
||||||
|
virtual bool cleanup();
|
||||||
|
|
||||||
|
private:
|
||||||
|
FILE *m_stdout;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool Mysqld_output_parser_unix::run_command(const char *command)
|
||||||
|
{
|
||||||
|
if (!(m_stdout= popen(command, "r")))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
We want fully buffered stream. We also want system to allocate
|
||||||
|
appropriate buffer.
|
||||||
|
*/
|
||||||
|
|
||||||
|
setvbuf(m_stdout, NULL, _IOFBF, 0);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Mysqld_output_parser_unix::read_line(char *line_buffer,
|
||||||
|
uint line_buffer_size)
|
||||||
|
{
|
||||||
|
char *retbuff = fgets(line_buffer, line_buffer_size, m_stdout);
|
||||||
|
/* Remove any tailing new line charaters */
|
||||||
|
if (line_buffer[line_buffer_size-1] == LF)
|
||||||
|
line_buffer[line_buffer_size-1]= '\0';
|
||||||
|
return (retbuff == NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Mysqld_output_parser_unix::cleanup()
|
||||||
|
{
|
||||||
|
if (m_stdout)
|
||||||
|
pclose(m_stdout);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* Windows */
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
Platform-specific implementation: Windows.
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
class Mysqld_output_parser_win : public Mysqld_output_parser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Mysqld_output_parser_win() :
|
||||||
|
m_internal_buffer(NULL),
|
||||||
|
m_internal_buffer_offset(0),
|
||||||
|
m_internal_buffer_size(0)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool run_command(const char *command);
|
||||||
|
virtual bool read_line(char *line_buffer,
|
||||||
|
uint line_buffer_size);
|
||||||
|
virtual bool cleanup();
|
||||||
|
|
||||||
|
private:
|
||||||
|
HANDLE m_h_child_stdout_wr;
|
||||||
|
HANDLE m_h_child_stdout_rd;
|
||||||
|
uint m_internal_buffer_offset;
|
||||||
|
uint m_internal_buffer_size;
|
||||||
|
char *m_internal_buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool Mysqld_output_parser_win::run_command(const char *command)
|
||||||
|
{
|
||||||
|
BOOL op_status;
|
||||||
|
|
||||||
|
SECURITY_ATTRIBUTES sa_attr;
|
||||||
|
sa_attr.nLength= sizeof(SECURITY_ATTRIBUTES);
|
||||||
|
sa_attr.bInheritHandle= TRUE;
|
||||||
|
sa_attr.lpSecurityDescriptor= NULL;
|
||||||
|
|
||||||
|
op_status= CreatePipe(&m_h_child_stdout_rd,
|
||||||
|
&m_h_child_stdout_wr,
|
||||||
|
&sa_attr,
|
||||||
|
0 /* Use system-default buffer size. */);
|
||||||
|
|
||||||
|
if (!op_status)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
SetHandleInformation(m_h_child_stdout_rd, HANDLE_FLAG_INHERIT, 0);
|
||||||
|
|
||||||
|
STARTUPINFO si_start_info;
|
||||||
|
ZeroMemory(&si_start_info, sizeof(STARTUPINFO));
|
||||||
|
si_start_info.cb= sizeof(STARTUPINFO);
|
||||||
|
si_start_info.hStdError= m_h_child_stdout_wr;
|
||||||
|
si_start_info.hStdOutput= m_h_child_stdout_wr;
|
||||||
|
si_start_info.dwFlags|= STARTF_USESTDHANDLES;
|
||||||
|
|
||||||
|
PROCESS_INFORMATION pi_proc_info;
|
||||||
|
|
||||||
|
op_status= CreateProcess(NULL, /* Application name. */
|
||||||
|
(char*)command, /* Command line. */
|
||||||
|
NULL, /* Process security attributes. */
|
||||||
|
NULL, /* Primary thread security attr.*/
|
||||||
|
TRUE, /* Handles are inherited. */
|
||||||
|
0, /* Creation flags. */
|
||||||
|
NULL, /* Use parent's environment. */
|
||||||
|
NULL, /* Use parent's curr. directory. */
|
||||||
|
&si_start_info, /* STARTUPINFO pointer. */
|
||||||
|
&pi_proc_info); /* Rec. PROCESS_INFORMATION. */
|
||||||
|
|
||||||
|
if (!op_status)
|
||||||
|
{
|
||||||
|
CloseHandle(m_h_child_stdout_rd);
|
||||||
|
CloseHandle(m_h_child_stdout_wr);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close unnessary handles. */
|
||||||
|
|
||||||
|
CloseHandle(pi_proc_info.hProcess);
|
||||||
|
CloseHandle(pi_proc_info.hThread);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Mysqld_output_parser_win::read_line(char *line_buffer,
|
||||||
|
uint line_buffer_size)
|
||||||
|
{
|
||||||
|
DWORD dw_read_count= m_internal_buffer_size;
|
||||||
|
bzero(line_buffer,line_buffer_size);
|
||||||
|
char *buff_ptr= line_buffer;
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
while ((unsigned)(buff_ptr - line_buffer) < line_buffer_size)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
ReadFile(m_h_child_stdout_rd, &ch,
|
||||||
|
1, &dw_read_count, NULL);
|
||||||
|
} while ((ch == CR || ch == LF) && buff_ptr == line_buffer);
|
||||||
|
|
||||||
|
if (dw_read_count == 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if (ch == CR || ch == LF)
|
||||||
|
break;
|
||||||
|
|
||||||
|
*buff_ptr++ = ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Mysqld_output_parser_win::cleanup()
|
||||||
|
{
|
||||||
|
/* Close all handles. */
|
||||||
|
|
||||||
|
CloseHandle(m_h_child_stdout_wr);
|
||||||
|
CloseHandle(m_h_child_stdout_rd);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
|
} /* End of private module implementation. */
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Parse output of the given command
|
||||||
|
|
||||||
|
@param command The command to execute.
|
||||||
|
@param option_name_str Option name.
|
||||||
|
@param option_name_length Length of the option name.
|
||||||
|
@param[out] option_value_buf The buffer to store option value.
|
||||||
|
@param option_value_buf_size Size of the option value buffer.
|
||||||
|
@param option_type Type of the option:
|
||||||
|
- GET_LINE if we want to get all the
|
||||||
|
line after the option name;
|
||||||
|
- GET_VALUE otherwise.
|
||||||
|
|
||||||
|
Execute the process by running "command". Find the "option name" and
|
||||||
|
return the next word if "option_type" is GET_VALUE. Return the rest of
|
||||||
|
the parsed string otherwise.
|
||||||
|
|
||||||
|
@note This function has a separate windows implementation.
|
||||||
|
|
||||||
|
@return The error status.
|
||||||
|
@retval FALSE Ok, the option name has been found.
|
||||||
|
@retval TRUE Error occured or the option name is not found.
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool parse_output_and_get_value(const char *command,
|
||||||
|
const char *option_name_str,
|
||||||
|
uint option_name_length,
|
||||||
|
char *option_value_buf,
|
||||||
|
size_t option_value_buf_size,
|
||||||
|
enum_option_type option_type)
|
||||||
|
{
|
||||||
|
#ifndef __WIN__
|
||||||
|
Mysqld_output_parser_unix parser;
|
||||||
|
#else /* __WIN__ */
|
||||||
|
Mysqld_output_parser_win parser;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return parser.parse(command,
|
||||||
|
option_name_str,
|
||||||
|
option_name_length,
|
||||||
|
option_value_buf,
|
||||||
|
option_value_buf_size,
|
||||||
|
option_type);
|
||||||
|
}
|
||||||
|
@ -17,11 +17,17 @@
|
|||||||
|
|
||||||
#include <my_global.h>
|
#include <my_global.h>
|
||||||
|
|
||||||
#define GET_VALUE 1
|
enum enum_option_type
|
||||||
#define GET_LINE 2
|
{
|
||||||
|
GET_VALUE = 1,
|
||||||
|
GET_LINE
|
||||||
|
};
|
||||||
|
|
||||||
int parse_output_and_get_value(const char *command, const char *word,
|
bool parse_output_and_get_value(const char *command,
|
||||||
char *result, size_t input_buffer_len,
|
const char *option_name_str,
|
||||||
uint flag);
|
uint option_name_length,
|
||||||
|
char *option_value_buf,
|
||||||
|
size_t option_value_buf_size,
|
||||||
|
enum_option_type option_type);
|
||||||
|
|
||||||
#endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_PARSE_OUTPUT_H */
|
#endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_PARSE_OUTPUT_H */
|
||||||
|
@ -48,11 +48,16 @@ typedef int pid_t;
|
|||||||
#define NEWLINE "\r\n"
|
#define NEWLINE "\r\n"
|
||||||
#define NEWLINE_LEN 2
|
#define NEWLINE_LEN 2
|
||||||
|
|
||||||
|
const char CR = '\r';
|
||||||
|
const char LF = '\n';
|
||||||
|
|
||||||
#else /* ! __WIN__ */
|
#else /* ! __WIN__ */
|
||||||
|
|
||||||
#define NEWLINE "\n"
|
#define NEWLINE "\n"
|
||||||
#define NEWLINE_LEN 1
|
#define NEWLINE_LEN 1
|
||||||
|
|
||||||
|
const char LF = '\n';
|
||||||
|
|
||||||
#endif /* __WIN__ */
|
#endif /* __WIN__ */
|
||||||
|
|
||||||
#endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_PORTABILITY_H */
|
#endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_PORTABILITY_H */
|
||||||
|
@ -64,11 +64,14 @@ Thread_registry::~Thread_registry()
|
|||||||
/* Check that no one uses the repository. */
|
/* Check that no one uses the repository. */
|
||||||
pthread_mutex_lock(&LOCK_thread_registry);
|
pthread_mutex_lock(&LOCK_thread_registry);
|
||||||
|
|
||||||
if (head.next != &head)
|
for (Thread_info *ti= head.next; ti != &head; ti= ti->next)
|
||||||
log_error("Not all threads died properly\n");
|
{
|
||||||
|
log_error("Thread_registry: unregistered thread: %lu.",
|
||||||
|
(unsigned long) ti->thread_id);
|
||||||
|
}
|
||||||
|
|
||||||
/* All threads must unregister */
|
/* All threads must unregister */
|
||||||
// Disabled assert temporarily - BUG#28030
|
DBUG_ASSERT(head.next == &head);
|
||||||
// DBUG_ASSERT(head.next == &head);
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&LOCK_thread_registry);
|
pthread_mutex_unlock(&LOCK_thread_registry);
|
||||||
pthread_cond_destroy(&COND_thread_registry_is_empty);
|
pthread_cond_destroy(&COND_thread_registry_is_empty);
|
||||||
|
@ -979,17 +979,18 @@ Event_queue_element::load_from_row(THD *thd, TABLE *table)
|
|||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
|
|
||||||
starts_null= table->field[ET_FIELD_STARTS]->is_null();
|
starts_null= table->field[ET_FIELD_STARTS]->is_null();
|
||||||
|
my_bool not_used= FALSE;
|
||||||
if (!starts_null)
|
if (!starts_null)
|
||||||
{
|
{
|
||||||
table->field[ET_FIELD_STARTS]->get_date(&time, TIME_NO_ZERO_DATE);
|
table->field[ET_FIELD_STARTS]->get_date(&time, TIME_NO_ZERO_DATE);
|
||||||
starts= sec_since_epoch_TIME(&time);
|
starts= my_tz_OFFSET0->TIME_to_gmt_sec(&time,¬_used);
|
||||||
}
|
}
|
||||||
|
|
||||||
ends_null= table->field[ET_FIELD_ENDS]->is_null();
|
ends_null= table->field[ET_FIELD_ENDS]->is_null();
|
||||||
if (!ends_null)
|
if (!ends_null)
|
||||||
{
|
{
|
||||||
table->field[ET_FIELD_ENDS]->get_date(&time, TIME_NO_ZERO_DATE);
|
table->field[ET_FIELD_ENDS]->get_date(&time, TIME_NO_ZERO_DATE);
|
||||||
ends= sec_since_epoch_TIME(&time);
|
ends= my_tz_OFFSET0->TIME_to_gmt_sec(&time,¬_used);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!table->field[ET_FIELD_INTERVAL_EXPR]->is_null())
|
if (!table->field[ET_FIELD_INTERVAL_EXPR]->is_null())
|
||||||
@ -1007,7 +1008,7 @@ Event_queue_element::load_from_row(THD *thd, TABLE *table)
|
|||||||
if (table->field[ET_FIELD_EXECUTE_AT]->get_date(&time,
|
if (table->field[ET_FIELD_EXECUTE_AT]->get_date(&time,
|
||||||
TIME_NO_ZERO_DATE))
|
TIME_NO_ZERO_DATE))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
execute_at= sec_since_epoch_TIME(&time);
|
execute_at= my_tz_OFFSET0->TIME_to_gmt_sec(&time,¬_used);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1039,7 +1040,7 @@ Event_queue_element::load_from_row(THD *thd, TABLE *table)
|
|||||||
{
|
{
|
||||||
table->field[ET_FIELD_LAST_EXECUTED]->get_date(&time,
|
table->field[ET_FIELD_LAST_EXECUTED]->get_date(&time,
|
||||||
TIME_NO_ZERO_DATE);
|
TIME_NO_ZERO_DATE);
|
||||||
last_executed= sec_since_epoch_TIME(&time);
|
last_executed= my_tz_OFFSET0->TIME_to_gmt_sec(&time,¬_used);
|
||||||
}
|
}
|
||||||
last_executed_changed= FALSE;
|
last_executed_changed= FALSE;
|
||||||
|
|
||||||
|
@ -250,7 +250,7 @@ mysql_event_fill_row(THD *thd,
|
|||||||
if (!et->starts_null)
|
if (!et->starts_null)
|
||||||
{
|
{
|
||||||
MYSQL_TIME time;
|
MYSQL_TIME time;
|
||||||
my_tz_UTC->gmt_sec_to_TIME(&time, et->starts);
|
my_tz_OFFSET0->gmt_sec_to_TIME(&time, et->starts);
|
||||||
|
|
||||||
fields[ET_FIELD_STARTS]->set_notnull();
|
fields[ET_FIELD_STARTS]->set_notnull();
|
||||||
fields[ET_FIELD_STARTS]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
|
fields[ET_FIELD_STARTS]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
|
||||||
@ -259,7 +259,7 @@ mysql_event_fill_row(THD *thd,
|
|||||||
if (!et->ends_null)
|
if (!et->ends_null)
|
||||||
{
|
{
|
||||||
MYSQL_TIME time;
|
MYSQL_TIME time;
|
||||||
my_tz_UTC->gmt_sec_to_TIME(&time, et->ends);
|
my_tz_OFFSET0->gmt_sec_to_TIME(&time, et->ends);
|
||||||
|
|
||||||
fields[ET_FIELD_ENDS]->set_notnull();
|
fields[ET_FIELD_ENDS]->set_notnull();
|
||||||
fields[ET_FIELD_ENDS]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
|
fields[ET_FIELD_ENDS]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
|
||||||
@ -278,7 +278,7 @@ mysql_event_fill_row(THD *thd,
|
|||||||
fields[ET_FIELD_ENDS]->set_null();
|
fields[ET_FIELD_ENDS]->set_null();
|
||||||
|
|
||||||
MYSQL_TIME time;
|
MYSQL_TIME time;
|
||||||
my_tz_UTC->gmt_sec_to_TIME(&time, et->execute_at);
|
my_tz_OFFSET0->gmt_sec_to_TIME(&time, et->execute_at);
|
||||||
|
|
||||||
fields[ET_FIELD_EXECUTE_AT]->set_notnull();
|
fields[ET_FIELD_EXECUTE_AT]->set_notnull();
|
||||||
fields[ET_FIELD_EXECUTE_AT]->
|
fields[ET_FIELD_EXECUTE_AT]->
|
||||||
@ -1004,7 +1004,7 @@ update_timing_fields_for_event(THD *thd,
|
|||||||
if (update_last_executed)
|
if (update_last_executed)
|
||||||
{
|
{
|
||||||
MYSQL_TIME time;
|
MYSQL_TIME time;
|
||||||
my_tz_UTC->gmt_sec_to_TIME(&time, last_executed);
|
my_tz_OFFSET0->gmt_sec_to_TIME(&time, last_executed);
|
||||||
|
|
||||||
fields[ET_FIELD_LAST_EXECUTED]->set_notnull();
|
fields[ET_FIELD_LAST_EXECUTED]->set_notnull();
|
||||||
fields[ET_FIELD_LAST_EXECUTED]->store_time(&time,
|
fields[ET_FIELD_LAST_EXECUTED]->store_time(&time,
|
||||||
|
@ -740,7 +740,7 @@ Event_queue::dump_internal_status()
|
|||||||
printf("WOC : %s\n", waiting_on_cond? "YES":"NO");
|
printf("WOC : %s\n", waiting_on_cond? "YES":"NO");
|
||||||
|
|
||||||
MYSQL_TIME time;
|
MYSQL_TIME time;
|
||||||
my_tz_UTC->gmt_sec_to_TIME(&time, next_activation_at);
|
my_tz_OFFSET0->gmt_sec_to_TIME(&time, next_activation_at);
|
||||||
if (time.year != 1970)
|
if (time.year != 1970)
|
||||||
printf("Next activation : %04d-%02d-%02d %02d:%02d:%02d\n",
|
printf("Next activation : %04d-%02d-%02d %02d:%02d:%02d\n",
|
||||||
time.year, time.month, time.day, time.hour, time.minute, time.second);
|
time.year, time.month, time.day, time.hour, time.minute, time.second);
|
||||||
|
@ -1516,34 +1516,6 @@ THD *handler::ha_thd(void) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool handler::check_if_log_table_locking_is_allowed(uint sql_command,
|
|
||||||
ulong type, TABLE *table)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
Deny locking of the log tables, which is incompatible with
|
|
||||||
concurrent insert. The routine is not called if the table is
|
|
||||||
being locked from a logger THD (general_log_thd or slow_log_thd)
|
|
||||||
or from a privileged thread (see log.cc for details)
|
|
||||||
*/
|
|
||||||
if (table->s->log_table &&
|
|
||||||
sql_command != SQLCOM_TRUNCATE &&
|
|
||||||
sql_command != SQLCOM_ALTER_TABLE &&
|
|
||||||
!(sql_command == SQLCOM_FLUSH &&
|
|
||||||
type & REFRESH_LOG) &&
|
|
||||||
(table->reginfo.lock_type >= TL_READ_NO_INSERT))
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
The check >= TL_READ_NO_INSERT denies all write locks
|
|
||||||
plus the only read lock (TL_READ_NO_INSERT itself)
|
|
||||||
*/
|
|
||||||
table->reginfo.lock_type == TL_READ_NO_INSERT ?
|
|
||||||
my_error(ER_CANT_READ_LOCK_LOG_TABLE, MYF(0)) :
|
|
||||||
my_error(ER_CANT_WRITE_LOCK_LOG_TABLE, MYF(0));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @brief
|
/** @brief
|
||||||
Open database-handler.
|
Open database-handler.
|
||||||
|
|
||||||
@ -3687,6 +3659,7 @@ int handler::ha_write_row(uchar *buf)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int handler::ha_update_row(const uchar *old_data, uchar *new_data)
|
int handler::ha_update_row(const uchar *old_data, uchar *new_data)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
@ -992,6 +992,7 @@ public:
|
|||||||
uint ref_length;
|
uint ref_length;
|
||||||
FT_INFO *ft_handler;
|
FT_INFO *ft_handler;
|
||||||
enum {NONE=0, INDEX, RND} inited;
|
enum {NONE=0, INDEX, RND} inited;
|
||||||
|
bool locked;
|
||||||
bool implicit_emptied; /* Can be !=0 only if HEAP */
|
bool implicit_emptied; /* Can be !=0 only if HEAP */
|
||||||
const COND *pushed_cond;
|
const COND *pushed_cond;
|
||||||
/*
|
/*
|
||||||
@ -1022,11 +1023,13 @@ public:
|
|||||||
estimation_rows_to_insert(0), ht(ht_arg),
|
estimation_rows_to_insert(0), ht(ht_arg),
|
||||||
ref(0), key_used_on_scan(MAX_KEY), active_index(MAX_KEY),
|
ref(0), key_used_on_scan(MAX_KEY), active_index(MAX_KEY),
|
||||||
ref_length(sizeof(my_off_t)),
|
ref_length(sizeof(my_off_t)),
|
||||||
ft_handler(0), inited(NONE), implicit_emptied(0),
|
ft_handler(0), inited(NONE),
|
||||||
|
locked(FALSE), implicit_emptied(0),
|
||||||
pushed_cond(0), next_insert_id(0), insert_id_for_cur_row(0)
|
pushed_cond(0), next_insert_id(0), insert_id_for_cur_row(0)
|
||||||
{}
|
{}
|
||||||
virtual ~handler(void)
|
virtual ~handler(void)
|
||||||
{
|
{
|
||||||
|
DBUG_ASSERT(locked == FALSE);
|
||||||
/* TODO: DBUG_ASSERT(inited == NONE); */
|
/* TODO: DBUG_ASSERT(inited == NONE); */
|
||||||
}
|
}
|
||||||
virtual handler *clone(MEM_ROOT *mem_root);
|
virtual handler *clone(MEM_ROOT *mem_root);
|
||||||
@ -1035,44 +1038,6 @@ public:
|
|||||||
{
|
{
|
||||||
cached_table_flags= table_flags();
|
cached_table_flags= table_flags();
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
Check whether a handler allows to lock the table.
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
check_if_locking_is_allowed()
|
|
||||||
thd Handler of the thread, trying to lock the table
|
|
||||||
table Table handler to check
|
|
||||||
count Total number of tables to be locked
|
|
||||||
current Index of the current table in the list of the tables
|
|
||||||
to be locked.
|
|
||||||
system_count Pointer to the counter of system tables seen thus
|
|
||||||
far.
|
|
||||||
called_by_privileged_thread TRUE if called from a logger THD
|
|
||||||
(general_log_thd or slow_log_thd)
|
|
||||||
or by a privileged thread, which
|
|
||||||
has the right to lock log tables.
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
Check whether a handler allows to lock the table. For instance,
|
|
||||||
MyISAM does not allow to lock mysql.proc along with other tables.
|
|
||||||
This limitation stems from the fact that MyISAM does not support
|
|
||||||
row-level locking and we have to add this limitation to avoid
|
|
||||||
deadlocks.
|
|
||||||
|
|
||||||
RETURN
|
|
||||||
TRUE Locking is allowed
|
|
||||||
FALSE Locking is not allowed. The error was thrown.
|
|
||||||
*/
|
|
||||||
virtual bool check_if_locking_is_allowed(uint sql_command,
|
|
||||||
ulong type, TABLE *table,
|
|
||||||
uint count, uint current,
|
|
||||||
uint *system_count,
|
|
||||||
bool called_by_privileged_thread)
|
|
||||||
{
|
|
||||||
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);
|
int ha_open(TABLE *table, const char *name, int mode, int test_if_locked);
|
||||||
void adjust_next_insert_id_after_explicit_value(ulonglong nr);
|
void adjust_next_insert_id_after_explicit_value(ulonglong nr);
|
||||||
int update_auto_increment();
|
int update_auto_increment();
|
||||||
@ -1629,8 +1594,10 @@ public:
|
|||||||
|
|
||||||
/* lock_count() can be more than one if the table is a MERGE */
|
/* lock_count() can be more than one if the table is a MERGE */
|
||||||
virtual uint lock_count(void) const { return 1; }
|
virtual uint lock_count(void) const { return 1; }
|
||||||
/*
|
/**
|
||||||
NOTE that one can NOT rely on table->in_use in store_lock(). It may
|
Is not invoked for non-transactional temporary tables.
|
||||||
|
|
||||||
|
@note that one can NOT rely on table->in_use in store_lock(). It may
|
||||||
refer to a different thread if called from mysql_lock_abort_for_thread().
|
refer to a different thread if called from mysql_lock_abort_for_thread().
|
||||||
*/
|
*/
|
||||||
virtual THR_LOCK_DATA **store_lock(THD *thd,
|
virtual THR_LOCK_DATA **store_lock(THD *thd,
|
||||||
@ -1761,6 +1728,29 @@ private:
|
|||||||
overridden by the storage engine class. To call these methods, use
|
overridden by the storage engine class. To call these methods, use
|
||||||
the corresponding 'ha_*' method above.
|
the corresponding 'ha_*' method above.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
Is not invoked for non-transactional temporary tables.
|
||||||
|
|
||||||
|
Tells the storage engine that we intend to read or write data
|
||||||
|
from the table. This call is prefixed with a call to handler::store_lock()
|
||||||
|
and is invoked only for those handler instances that stored the lock.
|
||||||
|
|
||||||
|
Calls to rnd_init/index_init are prefixed with this call. When table
|
||||||
|
IO is complete, we call external_lock(F_UNLCK).
|
||||||
|
A storage engine writer should expect that each call to
|
||||||
|
::external_lock(F_[RD|WR]LOCK is followed by a call to
|
||||||
|
::external_lock(F_UNLCK). If it is not, it is a bug in MySQL.
|
||||||
|
|
||||||
|
The name and signature originate from the first implementation
|
||||||
|
in MyISAM, which would call fcntl to set/clear an advisory
|
||||||
|
lock on the data file in this method.
|
||||||
|
|
||||||
|
@param lock_type F_RDLCK, F_WRLCK, F_UNLCK
|
||||||
|
|
||||||
|
@return non-0 in case of failure, 0 in case of success.
|
||||||
|
When lock_type is F_UNLCK, the return value is ignored.
|
||||||
|
*/
|
||||||
virtual int external_lock(THD *thd __attribute__((unused)),
|
virtual int external_lock(THD *thd __attribute__((unused)),
|
||||||
int lock_type __attribute__((unused)))
|
int lock_type __attribute__((unused)))
|
||||||
{
|
{
|
||||||
|
125
sql/lock.cc
125
sql/lock.cc
@ -116,16 +116,90 @@ static void print_lock_error(int error, const char *);
|
|||||||
static int thr_lock_errno_to_mysql[]=
|
static int thr_lock_errno_to_mysql[]=
|
||||||
{ 0, 1, ER_LOCK_WAIT_TIMEOUT, ER_LOCK_DEADLOCK };
|
{ 0, 1, ER_LOCK_WAIT_TIMEOUT, ER_LOCK_DEADLOCK };
|
||||||
|
|
||||||
|
/**
|
||||||
|
Perform semantic checks for mysql_lock_tables.
|
||||||
|
@param thd The current thread
|
||||||
|
@param tables The tables to lock
|
||||||
|
@param count The number of tables to lock
|
||||||
|
@param flags Lock flags
|
||||||
|
@return 0 if all the check passed, non zero if a check failed.
|
||||||
|
*/
|
||||||
|
int mysql_lock_tables_check(THD *thd, TABLE **tables, uint count, uint flags)
|
||||||
|
{
|
||||||
|
bool log_table_write_query;
|
||||||
|
uint system_count;
|
||||||
|
uint i;
|
||||||
|
|
||||||
|
DBUG_ENTER("mysql_lock_tables_check");
|
||||||
|
|
||||||
|
system_count= 0;
|
||||||
|
log_table_write_query= (is_log_table_write_query(thd->lex->sql_command)
|
||||||
|
|| ((flags & MYSQL_LOCK_PERF_SCHEMA) != 0));
|
||||||
|
|
||||||
|
for (i=0 ; i<count; i++)
|
||||||
|
{
|
||||||
|
TABLE *t= tables[i];
|
||||||
|
|
||||||
|
/* Protect against 'fake' partially initialized TABLE_SHARE */
|
||||||
|
DBUG_ASSERT(t->s->table_category != TABLE_UNKNOWN_CATEGORY);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Table I/O to performance schema tables is performed
|
||||||
|
only internally by the server implementation.
|
||||||
|
When a user is requesting a lock, the following
|
||||||
|
constraints are enforced:
|
||||||
|
*/
|
||||||
|
if (t->s->require_write_privileges() &&
|
||||||
|
! log_table_write_query)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
A user should not be able to prevent writes,
|
||||||
|
or hold any type of lock in a session,
|
||||||
|
since this would be a DOS attack.
|
||||||
|
*/
|
||||||
|
if ((t->reginfo.lock_type >= TL_READ_NO_INSERT)
|
||||||
|
|| (thd->lex->sql_command == SQLCOM_LOCK_TABLES))
|
||||||
|
{
|
||||||
|
my_error(ER_CANT_LOCK_LOG_TABLE, MYF(0));
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((t->s->table_category == TABLE_CATEGORY_SYSTEM) &&
|
||||||
|
(t->reginfo.lock_type >= TL_WRITE_ALLOW_WRITE))
|
||||||
|
{
|
||||||
|
system_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Locking of system tables is restricted:
|
||||||
|
locking a mix of system and non-system tables in the same lock
|
||||||
|
is prohibited, to prevent contention.
|
||||||
|
*/
|
||||||
|
if ((system_count > 0) && (system_count < count))
|
||||||
|
{
|
||||||
|
my_error(ER_WRONG_LOCK_OF_SYSTEM_TABLE, MYF(0));
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count,
|
MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count,
|
||||||
uint flags, bool *need_reopen)
|
uint flags, bool *need_reopen)
|
||||||
{
|
{
|
||||||
MYSQL_LOCK *sql_lock;
|
MYSQL_LOCK *sql_lock;
|
||||||
TABLE *write_lock_used;
|
TABLE *write_lock_used;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
DBUG_ENTER("mysql_lock_tables");
|
DBUG_ENTER("mysql_lock_tables");
|
||||||
|
|
||||||
*need_reopen= FALSE;
|
*need_reopen= FALSE;
|
||||||
|
|
||||||
|
if (mysql_lock_tables_check(thd, tables, count, flags))
|
||||||
|
DBUG_RETURN (NULL);
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (! (sql_lock= get_lock_data(thd, tables, count, GET_LOCK_STORE_LOCKS,
|
if (! (sql_lock= get_lock_data(thd, tables, count, GET_LOCK_STORE_LOCKS,
|
||||||
@ -175,7 +249,8 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count,
|
|||||||
|
|
||||||
thd->proc_info="System lock";
|
thd->proc_info="System lock";
|
||||||
DBUG_PRINT("info", ("thd->proc_info %s", thd->proc_info));
|
DBUG_PRINT("info", ("thd->proc_info %s", thd->proc_info));
|
||||||
if (lock_external(thd, tables, count))
|
if (sql_lock->table_count && lock_external(thd, sql_lock->table,
|
||||||
|
sql_lock->table_count))
|
||||||
{
|
{
|
||||||
/* Clear the lock type of all lock data to avoid reusage. */
|
/* Clear the lock type of all lock data to avoid reusage. */
|
||||||
reset_lock_data(sql_lock);
|
reset_lock_data(sql_lock);
|
||||||
@ -271,6 +346,7 @@ static int lock_external(THD *thd, TABLE **tables, uint count)
|
|||||||
((*tables)->reginfo.lock_type >= TL_READ &&
|
((*tables)->reginfo.lock_type >= TL_READ &&
|
||||||
(*tables)->reginfo.lock_type <= TL_READ_NO_INSERT))
|
(*tables)->reginfo.lock_type <= TL_READ_NO_INSERT))
|
||||||
lock_type=F_RDLCK;
|
lock_type=F_RDLCK;
|
||||||
|
|
||||||
if ((error=(*tables)->file->ha_external_lock(thd,lock_type)))
|
if ((error=(*tables)->file->ha_external_lock(thd,lock_type)))
|
||||||
{
|
{
|
||||||
print_lock_error(error, (*tables)->file->table_type());
|
print_lock_error(error, (*tables)->file->table_type());
|
||||||
@ -379,10 +455,28 @@ void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Try to find the table in the list of locked tables.
|
||||||
|
In case of success, unlock the table and remove it from this list.
|
||||||
|
|
||||||
void mysql_lock_remove(THD *thd, MYSQL_LOCK *locked,TABLE *table)
|
@note This function has a legacy side effect: the table is
|
||||||
|
unlocked even if it is not found in the locked list.
|
||||||
|
It's not clear if this side effect is intentional or still
|
||||||
|
desirable. It might lead to unmatched calls to
|
||||||
|
unlock_external(). Moreover, a discrepancy can be left
|
||||||
|
unnoticed by the storage engine, because in
|
||||||
|
unlock_external() we call handler::external_lock(F_UNLCK) only
|
||||||
|
if table->current_lock is not F_UNLCK.
|
||||||
|
|
||||||
|
@param always_unlock specify explicitly if the legacy side
|
||||||
|
effect is desired.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void mysql_lock_remove(THD *thd, MYSQL_LOCK *locked,TABLE *table,
|
||||||
|
bool always_unlock)
|
||||||
{
|
{
|
||||||
mysql_unlock_some_tables(thd, &table,1);
|
if (always_unlock == TRUE)
|
||||||
|
mysql_unlock_some_tables(thd, &table, /* table count */ 1);
|
||||||
if (locked)
|
if (locked)
|
||||||
{
|
{
|
||||||
reg1 uint i;
|
reg1 uint i;
|
||||||
@ -396,6 +490,10 @@ void mysql_lock_remove(THD *thd, MYSQL_LOCK *locked,TABLE *table)
|
|||||||
|
|
||||||
DBUG_ASSERT(table->lock_position == i);
|
DBUG_ASSERT(table->lock_position == i);
|
||||||
|
|
||||||
|
/* Unlock if not yet unlocked */
|
||||||
|
if (always_unlock == FALSE)
|
||||||
|
mysql_unlock_some_tables(thd, &table, /* table count */ 1);
|
||||||
|
|
||||||
/* Decrement table_count in advance, making below expressions easier */
|
/* Decrement table_count in advance, making below expressions easier */
|
||||||
old_tables= --locked->table_count;
|
old_tables= --locked->table_count;
|
||||||
|
|
||||||
@ -445,7 +543,8 @@ void mysql_lock_downgrade_write(THD *thd, TABLE *table,
|
|||||||
{
|
{
|
||||||
MYSQL_LOCK *locked;
|
MYSQL_LOCK *locked;
|
||||||
TABLE *write_lock_used;
|
TABLE *write_lock_used;
|
||||||
if ((locked = get_lock_data(thd,&table,1,1,&write_lock_used)))
|
if ((locked = get_lock_data(thd, &table, 1, GET_LOCK_UNLOCK,
|
||||||
|
&write_lock_used)))
|
||||||
{
|
{
|
||||||
for (uint i=0; i < locked->lock_count; i++)
|
for (uint i=0; i < locked->lock_count; i++)
|
||||||
thr_downgrade_write_lock(locked->locks[i], new_lock_type);
|
thr_downgrade_write_lock(locked->locks[i], new_lock_type);
|
||||||
@ -704,25 +803,19 @@ static MYSQL_LOCK *get_lock_data(THD *thd, TABLE **table_ptr, uint count,
|
|||||||
TABLE **to, **table_buf;
|
TABLE **to, **table_buf;
|
||||||
DBUG_ENTER("get_lock_data");
|
DBUG_ENTER("get_lock_data");
|
||||||
|
|
||||||
|
DBUG_ASSERT((flags == GET_LOCK_UNLOCK) || (flags == GET_LOCK_STORE_LOCKS));
|
||||||
|
|
||||||
DBUG_PRINT("info", ("count %d", count));
|
DBUG_PRINT("info", ("count %d", count));
|
||||||
*write_lock_used=0;
|
*write_lock_used=0;
|
||||||
uint system_count= 0;
|
|
||||||
for (i=tables=lock_count=0 ; i < count ; i++)
|
for (i=tables=lock_count=0 ; i < count ; i++)
|
||||||
{
|
{
|
||||||
if (table_ptr[i]->s->tmp_table != NON_TRANSACTIONAL_TMP_TABLE)
|
TABLE *t= table_ptr[i];
|
||||||
|
|
||||||
|
if (t->s->tmp_table != NON_TRANSACTIONAL_TMP_TABLE)
|
||||||
{
|
{
|
||||||
tables+=table_ptr[i]->file->lock_count();
|
tables+= t->file->lock_count();
|
||||||
lock_count++;
|
lock_count++;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
Check if we can lock the table. For some tables we cannot do that
|
|
||||||
beacause of handler-specific locking issues.
|
|
||||||
*/
|
|
||||||
if (!table_ptr[i]-> file->
|
|
||||||
check_if_locking_is_allowed(thd->lex->sql_command, thd->lex->type,
|
|
||||||
table_ptr[i], count, i, &system_count,
|
|
||||||
logger.is_privileged_thread(thd)))
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
731
sql/log.cc
731
sql/log.cc
@ -57,6 +57,35 @@ static int binlog_commit(handlerton *hton, THD *thd, bool all);
|
|||||||
static int binlog_rollback(handlerton *hton, THD *thd, bool all);
|
static int binlog_rollback(handlerton *hton, THD *thd, bool all);
|
||||||
static int binlog_prepare(handlerton *hton, THD *thd, bool all);
|
static int binlog_prepare(handlerton *hton, THD *thd, bool all);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Silence all errors and warnings reported when performing a write
|
||||||
|
to a log table.
|
||||||
|
Errors and warnings are not reported to the client or SQL exception
|
||||||
|
handlers, so that the presence of logging does not interfere and affect
|
||||||
|
the logic of an application.
|
||||||
|
*/
|
||||||
|
class Silence_log_table_errors : public Internal_error_handler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Silence_log_table_errors()
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual ~Silence_log_table_errors() {}
|
||||||
|
|
||||||
|
virtual bool handle_error(uint sql_errno,
|
||||||
|
MYSQL_ERROR::enum_warning_level level,
|
||||||
|
THD *thd);
|
||||||
|
};
|
||||||
|
|
||||||
|
bool
|
||||||
|
Silence_log_table_errors::handle_error(uint /* sql_errno */,
|
||||||
|
MYSQL_ERROR::enum_warning_level /* level */,
|
||||||
|
THD * /* thd */)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
sql_print_message_func sql_print_message_handlers[3] =
|
sql_print_message_func sql_print_message_handlers[3] =
|
||||||
{
|
{
|
||||||
sql_print_information,
|
sql_print_information,
|
||||||
@ -187,6 +216,19 @@ public:
|
|||||||
|
|
||||||
handlerton *binlog_hton;
|
handlerton *binlog_hton;
|
||||||
|
|
||||||
|
bool LOGGER::is_log_table_enabled(uint log_table_type)
|
||||||
|
{
|
||||||
|
switch (log_table_type) {
|
||||||
|
case QUERY_LOG_SLOW:
|
||||||
|
return (table_log_handler != NULL) && opt_slow_log;
|
||||||
|
case QUERY_LOG_GENERAL:
|
||||||
|
return (table_log_handler != NULL) && opt_log ;
|
||||||
|
default:
|
||||||
|
DBUG_ASSERT(0);
|
||||||
|
return FALSE; /* make compiler happy */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Check if a given table is opened log table */
|
/* Check if a given table is opened log table */
|
||||||
int check_if_log_table(uint db_len, const char *db, uint table_name_len,
|
int check_if_log_table(uint db_len, const char *db, uint table_name_len,
|
||||||
@ -200,211 +242,38 @@ int check_if_log_table(uint db_len, const char *db, uint table_name_len,
|
|||||||
if (table_name_len == 11 && !(lower_case_table_names ?
|
if (table_name_len == 11 && !(lower_case_table_names ?
|
||||||
my_strcasecmp(system_charset_info,
|
my_strcasecmp(system_charset_info,
|
||||||
table_name, "general_log") :
|
table_name, "general_log") :
|
||||||
strcmp(table_name, "general_log")) &&
|
strcmp(table_name, "general_log")))
|
||||||
(!check_if_opened || logger.is_log_table_enabled(QUERY_LOG_GENERAL)))
|
{
|
||||||
return QUERY_LOG_GENERAL;
|
if (!check_if_opened || logger.is_log_table_enabled(QUERY_LOG_GENERAL))
|
||||||
else
|
return QUERY_LOG_GENERAL;
|
||||||
if (table_name_len == 8 && !(lower_case_table_names ?
|
return 0;
|
||||||
my_strcasecmp(system_charset_info, table_name, "slow_log") :
|
}
|
||||||
strcmp(table_name, "slow_log")) &&
|
|
||||||
(!check_if_opened ||logger.is_log_table_enabled(QUERY_LOG_SLOW)))
|
if (table_name_len == 8 && !(lower_case_table_names ?
|
||||||
|
my_strcasecmp(system_charset_info, table_name, "slow_log") :
|
||||||
|
strcmp(table_name, "slow_log")))
|
||||||
|
{
|
||||||
|
if (!check_if_opened || logger.is_log_table_enabled(QUERY_LOG_SLOW))
|
||||||
return QUERY_LOG_SLOW;
|
return QUERY_LOG_SLOW;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Open log table of a given type (general or slow log)
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
open_log_table()
|
|
||||||
|
|
||||||
log_table_type type of the log table to open: QUERY_LOG_GENERAL
|
|
||||||
or QUERY_LOG_SLOW
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
|
|
||||||
The function opens a log table and marks it as such. Log tables are open
|
|
||||||
during the whole time, while server is running. Except for the moments
|
|
||||||
when they have to be reopened: during FLUSH LOGS and TRUNCATE. This
|
|
||||||
function is invoked directly only once during startup. All subsequent
|
|
||||||
calls happen through reopen_log_table(), which performs additional check.
|
|
||||||
|
|
||||||
RETURN
|
|
||||||
FALSE - OK
|
|
||||||
TRUE - error occured
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool Log_to_csv_event_handler::open_log_table(uint log_table_type)
|
|
||||||
{
|
|
||||||
THD *log_thd, *curr= current_thd;
|
|
||||||
TABLE_LIST *table;
|
|
||||||
bool error= FALSE;
|
|
||||||
DBUG_ENTER("open_log_table");
|
|
||||||
|
|
||||||
switch (log_table_type) {
|
|
||||||
case QUERY_LOG_GENERAL:
|
|
||||||
log_thd= general_log_thd;
|
|
||||||
table= &general_log;
|
|
||||||
/* clean up table before reuse/initial usage */
|
|
||||||
bzero((char*) table, sizeof(TABLE_LIST));
|
|
||||||
table->alias= table->table_name= (char*) "general_log";
|
|
||||||
table->table_name_length= 11;
|
|
||||||
break;
|
|
||||||
case QUERY_LOG_SLOW:
|
|
||||||
log_thd= slow_log_thd;
|
|
||||||
table= &slow_log;
|
|
||||||
bzero((char*) table, sizeof(TABLE_LIST));
|
|
||||||
table->alias= table->table_name= (char*) "slow_log";
|
|
||||||
table->table_name_length= 8;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0); // Impossible
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
This way we check that appropriate log thd was created ok during
|
|
||||||
initialization. We cannot check "is_log_tables_initialized" var, as
|
|
||||||
the very initialization is not finished until this function is
|
|
||||||
completed in the very first time.
|
|
||||||
*/
|
|
||||||
if (!log_thd)
|
|
||||||
{
|
|
||||||
DBUG_PRINT("error",("Cannot initialize log tables"));
|
|
||||||
DBUG_RETURN(TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Set THD's thread_stack. This is needed to perform stack overrun
|
|
||||||
check, which is done by some routines (e.g. open_table()).
|
|
||||||
In the case we are called by thread, which already has this parameter
|
|
||||||
set, we use this value. Otherwise we do a wild guess. This won't help
|
|
||||||
to correctly track the stack overrun in these exceptional cases (which
|
|
||||||
could probably happen only during startup and shutdown) but at least
|
|
||||||
lets us to pass asserts.
|
|
||||||
The problem stems from the fact that logger THDs are not real threads.
|
|
||||||
*/
|
|
||||||
if (curr)
|
|
||||||
log_thd->thread_stack= curr->thread_stack;
|
|
||||||
else
|
|
||||||
log_thd->thread_stack= (char*) &log_thd;
|
|
||||||
|
|
||||||
log_thd->store_globals();
|
|
||||||
|
|
||||||
table->lock_type= TL_WRITE_CONCURRENT_INSERT;
|
|
||||||
table->db= log_thd->db;
|
|
||||||
table->db_length= log_thd->db_length;
|
|
||||||
|
|
||||||
lex_start(log_thd);
|
|
||||||
log_thd->clear_error();
|
|
||||||
if (simple_open_n_lock_tables(log_thd, table) ||
|
|
||||||
table->table->file->extra(HA_EXTRA_MARK_AS_LOG_TABLE) ||
|
|
||||||
table->table->file->ha_rnd_init(0))
|
|
||||||
error= TRUE;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
table->table->use_all_columns();
|
|
||||||
table->table->locked_by_logger= TRUE;
|
|
||||||
table->table->no_replicate= TRUE;
|
|
||||||
|
|
||||||
/* Honor next number columns if present */
|
|
||||||
table->table->next_number_field= table->table->found_next_number_field;
|
|
||||||
}
|
|
||||||
/* restore thread settings */
|
|
||||||
if (curr)
|
|
||||||
curr->store_globals();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
my_pthread_setspecific_ptr(THR_THD, 0);
|
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
After a log table was opened, we should clear privileged thread
|
|
||||||
flag (which allows locking of a log table by a special thread, usually
|
|
||||||
the one who closed log tables temporarily).
|
|
||||||
*/
|
|
||||||
privileged_thread= 0;
|
|
||||||
DBUG_RETURN(error);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Log_to_csv_event_handler::Log_to_csv_event_handler()
|
Log_to_csv_event_handler::Log_to_csv_event_handler()
|
||||||
{
|
{
|
||||||
/* init artificial THD's */
|
|
||||||
general_log_thd= new THD;
|
|
||||||
/* logger thread always works with mysql database */
|
|
||||||
general_log_thd->db= my_strdup("mysql", MYF(0));
|
|
||||||
general_log_thd->db_length= 5;
|
|
||||||
general_log.table= 0;
|
|
||||||
|
|
||||||
slow_log_thd= new THD;
|
|
||||||
/* logger thread always works with mysql database */
|
|
||||||
slow_log_thd->db= my_strdup("mysql", MYF(0));;
|
|
||||||
slow_log_thd->db_length= 5;
|
|
||||||
slow_log.table= 0;
|
|
||||||
/* no privileged thread exists at the moment */
|
|
||||||
privileged_thread= 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Log_to_csv_event_handler::~Log_to_csv_event_handler()
|
Log_to_csv_event_handler::~Log_to_csv_event_handler()
|
||||||
{
|
{
|
||||||
/* now cleanup the tables */
|
|
||||||
if (general_log_thd)
|
|
||||||
{
|
|
||||||
delete general_log_thd;
|
|
||||||
general_log_thd= NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (slow_log_thd)
|
|
||||||
{
|
|
||||||
delete slow_log_thd;
|
|
||||||
slow_log_thd= NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Reopen log table of a given type
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
reopen_log_table()
|
|
||||||
|
|
||||||
log_table_type type of the log table to open: QUERY_LOG_GENERAL
|
|
||||||
or QUERY_LOG_SLOW
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
|
|
||||||
The function is a wrapper around open_log_table(). It is used during
|
|
||||||
FLUSH LOGS and TRUNCATE of the log tables (i.e. when we need to close
|
|
||||||
and reopen them). The difference is in the check of the
|
|
||||||
logger.is_log_tables_initialized var, which can't be done in
|
|
||||||
open_log_table(), as it makes no sense during startup.
|
|
||||||
|
|
||||||
NOTE: this code assumes that we have logger mutex locked
|
|
||||||
|
|
||||||
RETURN
|
|
||||||
FALSE - ok
|
|
||||||
TRUE - open_log_table() returned an error
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool Log_to_csv_event_handler::reopen_log_table(uint log_table_type)
|
|
||||||
{
|
|
||||||
/* don't open the log table, if it wasn't enabled during startup */
|
|
||||||
if (!logger.is_log_tables_initialized)
|
|
||||||
return FALSE;
|
|
||||||
return open_log_table(log_table_type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Log_to_csv_event_handler::cleanup()
|
void Log_to_csv_event_handler::cleanup()
|
||||||
{
|
{
|
||||||
if (opt_log)
|
|
||||||
close_log_table(QUERY_LOG_GENERAL, FALSE);
|
|
||||||
if (opt_slow_log)
|
|
||||||
close_log_table(QUERY_LOG_SLOW, FALSE);
|
|
||||||
logger.is_log_tables_initialized= FALSE;
|
logger.is_log_tables_initialized= FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -436,49 +305,88 @@ void Log_to_csv_event_handler::cleanup()
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
bool Log_to_csv_event_handler::
|
bool Log_to_csv_event_handler::
|
||||||
log_general(time_t event_time, const char *user_host,
|
log_general(THD *thd, time_t event_time, const char *user_host,
|
||||||
uint user_host_len, int thread_id,
|
uint user_host_len, int thread_id,
|
||||||
const char *command_type, uint command_type_len,
|
const char *command_type, uint command_type_len,
|
||||||
const char *sql_text, uint sql_text_len,
|
const char *sql_text, uint sql_text_len,
|
||||||
CHARSET_INFO *client_cs)
|
CHARSET_INFO *client_cs)
|
||||||
{
|
{
|
||||||
TABLE *table= general_log.table;
|
TABLE_LIST table_list;
|
||||||
|
TABLE *table;
|
||||||
|
bool result= TRUE;
|
||||||
|
bool need_close= FALSE;
|
||||||
|
bool need_pop= FALSE;
|
||||||
|
bool need_rnd_end= FALSE;
|
||||||
uint field_index;
|
uint field_index;
|
||||||
|
Silence_log_table_errors error_handler;
|
||||||
|
Open_tables_state open_tables_backup;
|
||||||
|
Field_timestamp *field0;
|
||||||
|
ulonglong save_thd_options;
|
||||||
|
bool save_query_start_used;
|
||||||
|
time_t save_start_time;
|
||||||
|
time_t save_time_after_lock;
|
||||||
|
time_t save_user_time;
|
||||||
|
bool save_time_zone_used;
|
||||||
|
|
||||||
|
save_thd_options= thd->options;
|
||||||
|
thd->options&= ~OPTION_BIN_LOG;
|
||||||
|
|
||||||
|
save_query_start_used= thd->query_start_used;
|
||||||
|
save_start_time= thd->start_time;
|
||||||
|
save_time_after_lock= thd->time_after_lock;
|
||||||
|
save_user_time= thd->user_time;
|
||||||
|
save_time_zone_used= thd->time_zone_used;
|
||||||
|
|
||||||
|
bzero(& table_list, sizeof(TABLE_LIST));
|
||||||
|
table_list.alias= table_list.table_name= GENERAL_LOG_NAME.str;
|
||||||
|
table_list.table_name_length= GENERAL_LOG_NAME.length;
|
||||||
|
|
||||||
|
table_list.lock_type= TL_WRITE_CONCURRENT_INSERT;
|
||||||
|
|
||||||
|
table_list.db= MYSQL_SCHEMA_NAME.str;
|
||||||
|
table_list.db_length= MYSQL_SCHEMA_NAME.length;
|
||||||
|
|
||||||
|
table= open_performance_schema_table(thd, & table_list,
|
||||||
|
& open_tables_backup);
|
||||||
|
need_close= TRUE;
|
||||||
|
|
||||||
|
if (!table ||
|
||||||
|
table->file->extra(HA_EXTRA_MARK_AS_LOG_TABLE) ||
|
||||||
|
table->file->ha_rnd_init(0))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
need_rnd_end= TRUE;
|
||||||
|
|
||||||
|
/* Honor next number columns if present */
|
||||||
|
table->next_number_field= table->found_next_number_field;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
"INSERT INTO general_log" can generate warning sometimes.
|
"INSERT INTO general_log" can generate warning sometimes.
|
||||||
Let's reset warnings from previous queries,
|
|
||||||
otherwise warning list can grow too much,
|
|
||||||
so thd->query gets spoiled as some point in time,
|
|
||||||
and mysql_parse() receives a broken query.
|
|
||||||
QQ: this problem needs to be studied in more details.
|
QQ: this problem needs to be studied in more details.
|
||||||
Probably it's better to suppress warnings in logging INSERTs at all.
|
Comment this 2 lines and run "cast.test" to see what's happening:
|
||||||
Comment this line and run "cast.test" to see what's happening:
|
|
||||||
*/
|
*/
|
||||||
mysql_reset_errors(table->in_use, 1);
|
thd->push_internal_handler(& error_handler);
|
||||||
|
need_pop= TRUE;
|
||||||
/* below should never happen */
|
|
||||||
if (unlikely(!logger.is_log_tables_initialized))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
NOTE: we do not call restore_record() here, as all fields are
|
NOTE: we do not call restore_record() here, as all fields are
|
||||||
filled by the Logger (=> no need to load default ones).
|
filled by the Logger (=> no need to load default ones).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Set current time. Required for CURRENT_TIMESTAMP to work */
|
|
||||||
general_log_thd->start_time= event_time;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
We do not set a value for table->field[0], as it will use
|
We do not set a value for table->field[0], as it will use
|
||||||
default value (which is CURRENT_TIMESTAMP).
|
default value (which is CURRENT_TIMESTAMP).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* check that all columns exist */
|
/* check that all columns exist */
|
||||||
if (!table->field[1] || !table->field[2] || !table->field[3] ||
|
if (table->s->fields < 6)
|
||||||
!table->field[4] || !table->field[5])
|
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
DBUG_ASSERT(table->field[0]->type() == MYSQL_TYPE_TIMESTAMP);
|
||||||
|
|
||||||
|
field0= (Field_timestamp*) (table->field[0]);
|
||||||
|
field0->set_time();
|
||||||
|
|
||||||
/* do a write */
|
/* do a write */
|
||||||
if (table->field[1]->store(user_host, user_host_len, client_cs) ||
|
if (table->field[1]->store(user_host, user_host_len, client_cs) ||
|
||||||
table->field[2]->store((longlong) thread_id, TRUE) ||
|
table->field[2]->store((longlong) thread_id, TRUE) ||
|
||||||
@ -500,16 +408,39 @@ bool Log_to_csv_event_handler::
|
|||||||
table->field[field_index]->set_default();
|
table->field[field_index]->set_default();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* log table entries are not replicated at the moment */
|
/* log table entries are not replicated */
|
||||||
tmp_disable_binlog(current_thd);
|
if (table->file->ha_write_row(table->record[0]))
|
||||||
|
{
|
||||||
|
struct tm start;
|
||||||
|
localtime_r(&event_time, &start);
|
||||||
|
|
||||||
table->file->ha_write_row(table->record[0]);
|
sql_print_error("%02d%02d%02d %2d:%02d:%02d - Failed to write to mysql.general_log",
|
||||||
|
start.tm_year % 100, start.tm_mon + 1,
|
||||||
|
start.tm_mday, start.tm_hour,
|
||||||
|
start.tm_min, start.tm_sec);
|
||||||
|
}
|
||||||
|
|
||||||
reenable_binlog(current_thd);
|
result= FALSE;
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
err:
|
err:
|
||||||
return TRUE;
|
if (need_rnd_end)
|
||||||
|
{
|
||||||
|
table->file->ha_rnd_end();
|
||||||
|
table->file->ha_release_auto_increment();
|
||||||
|
}
|
||||||
|
if (need_pop)
|
||||||
|
thd->pop_internal_handler();
|
||||||
|
if (need_close)
|
||||||
|
close_performance_schema_table(thd, & open_tables_backup);
|
||||||
|
|
||||||
|
thd->options= save_thd_options;
|
||||||
|
|
||||||
|
thd->query_start_used= save_query_start_used;
|
||||||
|
thd->start_time= save_start_time;
|
||||||
|
thd->time_after_lock= save_time_after_lock;
|
||||||
|
thd->user_time= save_user_time;
|
||||||
|
thd->time_zone_used= save_time_zone_used;
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -548,34 +479,61 @@ bool Log_to_csv_event_handler::
|
|||||||
longlong query_time, longlong lock_time, bool is_command,
|
longlong query_time, longlong lock_time, bool is_command,
|
||||||
const char *sql_text, uint sql_text_len)
|
const char *sql_text, uint sql_text_len)
|
||||||
{
|
{
|
||||||
/* table variables */
|
TABLE_LIST table_list;
|
||||||
TABLE *table= slow_log.table;
|
TABLE *table;
|
||||||
|
bool result= TRUE;
|
||||||
|
bool need_close= FALSE;
|
||||||
|
bool need_rnd_end= FALSE;
|
||||||
|
Open_tables_state open_tables_backup;
|
||||||
|
bool save_query_start_used;
|
||||||
|
time_t save_start_time;
|
||||||
|
time_t save_time_after_lock;
|
||||||
|
time_t save_user_time;
|
||||||
|
bool save_time_zone_used;
|
||||||
CHARSET_INFO *client_cs= thd->variables.character_set_client;
|
CHARSET_INFO *client_cs= thd->variables.character_set_client;
|
||||||
|
|
||||||
DBUG_ENTER("log_slow");
|
DBUG_ENTER("Log_to_csv_event_handler::log_slow");
|
||||||
|
|
||||||
/* below should never happen */
|
bzero(& table_list, sizeof(TABLE_LIST));
|
||||||
if (unlikely(!logger.is_log_tables_initialized))
|
table_list.alias= table_list.table_name= SLOW_LOG_NAME.str;
|
||||||
return FALSE;
|
table_list.table_name_length= SLOW_LOG_NAME.length;
|
||||||
|
|
||||||
|
table_list.lock_type= TL_WRITE_CONCURRENT_INSERT;
|
||||||
|
|
||||||
|
table_list.db= MYSQL_SCHEMA_NAME.str;
|
||||||
|
table_list.db_length= MYSQL_SCHEMA_NAME.length;
|
||||||
|
|
||||||
|
save_query_start_used= thd->query_start_used;
|
||||||
|
save_start_time= thd->start_time;
|
||||||
|
save_time_after_lock= thd->time_after_lock;
|
||||||
|
save_user_time= thd->user_time;
|
||||||
|
save_time_zone_used= thd->time_zone_used;
|
||||||
|
|
||||||
|
table= open_performance_schema_table(thd, & table_list,
|
||||||
|
& open_tables_backup);
|
||||||
|
need_close= TRUE;
|
||||||
|
|
||||||
|
if (!table ||
|
||||||
|
table->file->extra(HA_EXTRA_MARK_AS_LOG_TABLE) ||
|
||||||
|
table->file->ha_rnd_init(0))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
need_rnd_end= TRUE;
|
||||||
|
|
||||||
|
/* Honor next number columns if present */
|
||||||
|
table->next_number_field= table->found_next_number_field;
|
||||||
|
|
||||||
/*
|
|
||||||
Set start time for CURRENT_TIMESTAMP to the start of the query.
|
|
||||||
This will be default value for the field[0]
|
|
||||||
*/
|
|
||||||
slow_log_thd->start_time= query_start_arg;
|
|
||||||
restore_record(table, s->default_values); // Get empty record
|
restore_record(table, s->default_values); // Get empty record
|
||||||
|
|
||||||
|
/* check that all columns exist */
|
||||||
|
if (table->s->fields < 11)
|
||||||
|
goto err;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
We do not set a value for table->field[0], as it will use
|
We do not set a value for table->field[0], as it will use
|
||||||
default value.
|
default value.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!table->field[1] || !table->field[2] || !table->field[3] ||
|
|
||||||
!table->field[4] || !table->field[5] || !table->field[6] ||
|
|
||||||
!table->field[7] || !table->field[8] || !table->field[9] ||
|
|
||||||
!table->field[10])
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
/* store the value */
|
/* store the value */
|
||||||
if (table->field[1]->store(user_host, user_host_len, client_cs))
|
if (table->field[1]->store(user_host, user_host_len, client_cs))
|
||||||
goto err;
|
goto err;
|
||||||
@ -612,7 +570,6 @@ bool Log_to_csv_event_handler::
|
|||||||
table->field[4]->set_null();
|
table->field[4]->set_null();
|
||||||
table->field[5]->set_null();
|
table->field[5]->set_null();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fill database field */
|
/* fill database field */
|
||||||
if (thd->db)
|
if (thd->db)
|
||||||
{
|
{
|
||||||
@ -654,17 +611,71 @@ bool Log_to_csv_event_handler::
|
|||||||
if (table->field[10]->store(sql_text,sql_text_len, client_cs))
|
if (table->field[10]->store(sql_text,sql_text_len, client_cs))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
/* log table entries are not replicated at the moment */
|
/* log table entries are not replicated */
|
||||||
tmp_disable_binlog(current_thd);
|
if (table->file->ha_write_row(table->record[0]))
|
||||||
|
{
|
||||||
|
struct tm start;
|
||||||
|
localtime_r(¤t_time, &start);
|
||||||
|
|
||||||
/* write the row */
|
sql_print_error("%02d%02d%02d %2d:%02d:%02d - Failed to write to mysql.slow_log",
|
||||||
table->file->ha_write_row(table->record[0]);
|
start.tm_year % 100, start.tm_mon + 1,
|
||||||
|
start.tm_mday, start.tm_hour,
|
||||||
|
start.tm_min, start.tm_sec);
|
||||||
|
}
|
||||||
|
|
||||||
reenable_binlog(current_thd);
|
result= FALSE;
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
err:
|
err:
|
||||||
DBUG_RETURN(1);
|
if (need_rnd_end)
|
||||||
|
{
|
||||||
|
table->file->ha_rnd_end();
|
||||||
|
table->file->ha_release_auto_increment();
|
||||||
|
}
|
||||||
|
if (need_close)
|
||||||
|
close_performance_schema_table(thd, & open_tables_backup);
|
||||||
|
|
||||||
|
thd->query_start_used= save_query_start_used;
|
||||||
|
thd->start_time= save_start_time;
|
||||||
|
thd->time_after_lock= save_time_after_lock;
|
||||||
|
thd->user_time= save_user_time;
|
||||||
|
thd->time_zone_used= save_time_zone_used;
|
||||||
|
DBUG_RETURN(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Log_to_csv_event_handler::
|
||||||
|
activate_log(THD *thd, uint log_table_type)
|
||||||
|
{
|
||||||
|
TABLE_LIST table_list;
|
||||||
|
TABLE *table;
|
||||||
|
int result;
|
||||||
|
Open_tables_state open_tables_backup;
|
||||||
|
|
||||||
|
DBUG_ENTER("Log_to_csv_event_handler::activate_log");
|
||||||
|
|
||||||
|
bzero(& table_list, sizeof(TABLE_LIST));
|
||||||
|
|
||||||
|
if (log_table_type == QUERY_LOG_GENERAL)
|
||||||
|
{
|
||||||
|
table_list.alias= table_list.table_name= GENERAL_LOG_NAME.str;
|
||||||
|
table_list.table_name_length= GENERAL_LOG_NAME.length;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(log_table_type == QUERY_LOG_SLOW);
|
||||||
|
table_list.alias= table_list.table_name= SLOW_LOG_NAME.str;
|
||||||
|
table_list.table_name_length= SLOW_LOG_NAME.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
table_list.lock_type= TL_WRITE_CONCURRENT_INSERT;
|
||||||
|
|
||||||
|
table_list.db= MYSQL_SCHEMA_NAME.str;
|
||||||
|
table_list.db_length= MYSQL_SCHEMA_NAME.length;
|
||||||
|
|
||||||
|
table= open_performance_schema_table(thd, & table_list,
|
||||||
|
& open_tables_backup);
|
||||||
|
result= (table ? 0 : 1);
|
||||||
|
close_performance_schema_table(thd, & open_tables_backup);
|
||||||
|
DBUG_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Log_to_csv_event_handler::
|
bool Log_to_csv_event_handler::
|
||||||
@ -710,7 +721,7 @@ bool Log_to_file_event_handler::
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
bool Log_to_file_event_handler::
|
bool Log_to_file_event_handler::
|
||||||
log_general(time_t event_time, const char *user_host,
|
log_general(THD *thd, time_t event_time, const char *user_host,
|
||||||
uint user_host_len, int thread_id,
|
uint user_host_len, int thread_id,
|
||||||
const char *command_type, uint command_type_len,
|
const char *command_type, uint command_type_len,
|
||||||
const char *sql_text, uint sql_text_len,
|
const char *sql_text, uint sql_text_len,
|
||||||
@ -787,7 +798,7 @@ bool LOGGER::error_log_print(enum loglevel level, const char *format,
|
|||||||
void LOGGER::cleanup_base()
|
void LOGGER::cleanup_base()
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(inited == 1);
|
DBUG_ASSERT(inited == 1);
|
||||||
(void) pthread_mutex_destroy(&LOCK_logger);
|
rwlock_destroy(&LOCK_logger);
|
||||||
if (table_log_handler)
|
if (table_log_handler)
|
||||||
{
|
{
|
||||||
table_log_handler->cleanup();
|
table_log_handler->cleanup();
|
||||||
@ -806,12 +817,6 @@ void LOGGER::cleanup_end()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LOGGER::close_log_table(uint log_table_type, bool lock_in_use)
|
|
||||||
{
|
|
||||||
table_log_handler->close_log_table(log_table_type, lock_in_use);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Perform basic log initialization: create file-based log handler and
|
Perform basic log initialization: create file-based log handler and
|
||||||
init error log.
|
init error log.
|
||||||
@ -833,7 +838,7 @@ void LOGGER::init_base()
|
|||||||
init_error_log(LOG_FILE);
|
init_error_log(LOG_FILE);
|
||||||
|
|
||||||
file_log_handler->init_pthread_objects();
|
file_log_handler->init_pthread_objects();
|
||||||
(void) pthread_mutex_init(&LOCK_logger, MY_MUTEX_INIT_SLOW);
|
my_rwlock_init(&LOCK_logger, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -848,29 +853,6 @@ void LOGGER::init_log_tables()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LOGGER::reopen_log_table(uint log_table_type)
|
|
||||||
{
|
|
||||||
return table_log_handler->reopen_log_table(log_table_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LOGGER::reopen_log_tables()
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
we use | and not || here, to ensure that both reopen_log_table
|
|
||||||
are called, even if the first one fails
|
|
||||||
*/
|
|
||||||
if ((opt_slow_log && logger.reopen_log_table(QUERY_LOG_SLOW)) |
|
|
||||||
(opt_log && logger.reopen_log_table(QUERY_LOG_GENERAL)))
|
|
||||||
return TRUE;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LOGGER::tmp_close_log_tables(THD *thd)
|
|
||||||
{
|
|
||||||
table_log_handler->tmp_close_log_tables(thd);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LOGGER::flush_logs(THD *thd)
|
bool LOGGER::flush_logs(THD *thd)
|
||||||
{
|
{
|
||||||
int rc= 0;
|
int rc= 0;
|
||||||
@ -879,19 +861,11 @@ bool LOGGER::flush_logs(THD *thd)
|
|||||||
Now we lock logger, as nobody should be able to use logging routines while
|
Now we lock logger, as nobody should be able to use logging routines while
|
||||||
log tables are closed
|
log tables are closed
|
||||||
*/
|
*/
|
||||||
logger.lock();
|
logger.lock_exclusive();
|
||||||
if (logger.is_log_tables_initialized)
|
|
||||||
table_log_handler->tmp_close_log_tables(thd); // the locking happens here
|
|
||||||
|
|
||||||
/* reopen log files */
|
/* reopen log files */
|
||||||
file_log_handler->flush();
|
file_log_handler->flush();
|
||||||
|
|
||||||
/* reopen tables in the case they were enabled */
|
|
||||||
if (logger.is_log_tables_initialized)
|
|
||||||
{
|
|
||||||
if (reopen_log_tables())
|
|
||||||
rc= TRUE;
|
|
||||||
}
|
|
||||||
/* end of log flush */
|
/* end of log flush */
|
||||||
logger.unlock();
|
logger.unlock();
|
||||||
return rc;
|
return rc;
|
||||||
@ -939,7 +913,7 @@ bool LOGGER::slow_log_print(THD *thd, const char *query, uint query_length,
|
|||||||
if (thd->slave_thread)
|
if (thd->slave_thread)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
lock();
|
lock_shared();
|
||||||
if (!opt_slow_log)
|
if (!opt_slow_log)
|
||||||
{
|
{
|
||||||
unlock();
|
unlock();
|
||||||
@ -1011,7 +985,7 @@ bool LOGGER::general_log_print(THD *thd, enum enum_server_command command,
|
|||||||
else
|
else
|
||||||
id=0; /* Log from connect handler */
|
id=0; /* Log from connect handler */
|
||||||
|
|
||||||
lock();
|
lock_shared();
|
||||||
if (!opt_log)
|
if (!opt_log)
|
||||||
{
|
{
|
||||||
unlock();
|
unlock();
|
||||||
@ -1035,7 +1009,7 @@ bool LOGGER::general_log_print(THD *thd, enum enum_server_command command,
|
|||||||
|
|
||||||
while (*current_handler)
|
while (*current_handler)
|
||||||
error+= (*current_handler++)->
|
error+= (*current_handler++)->
|
||||||
log_general(current_time, user_host_buff,
|
log_general(thd, current_time, user_host_buff,
|
||||||
user_host_len, id,
|
user_host_len, id,
|
||||||
command_name[(uint) command].str,
|
command_name[(uint) command].str,
|
||||||
command_name[(uint) command].length,
|
command_name[(uint) command].length,
|
||||||
@ -1122,35 +1096,51 @@ void LOGGER::init_general_log(uint general_log_printer)
|
|||||||
|
|
||||||
bool LOGGER::activate_log_handler(THD* thd, uint log_type)
|
bool LOGGER::activate_log_handler(THD* thd, uint log_type)
|
||||||
{
|
{
|
||||||
bool res= 0;
|
MYSQL_QUERY_LOG *file_log;
|
||||||
lock();
|
bool res= FALSE;
|
||||||
|
lock_exclusive();
|
||||||
switch (log_type) {
|
switch (log_type) {
|
||||||
case QUERY_LOG_SLOW:
|
case QUERY_LOG_SLOW:
|
||||||
if (!opt_slow_log)
|
if (!opt_slow_log)
|
||||||
{
|
{
|
||||||
if ((res= reopen_log_table(log_type)))
|
file_log= file_log_handler->get_mysql_slow_log();
|
||||||
goto err;
|
|
||||||
file_log_handler->get_mysql_slow_log()->
|
file_log->open_slow_log(sys_var_slow_log_path.value);
|
||||||
open_slow_log(sys_var_slow_log_path.value);
|
if (table_log_handler->activate_log(thd, QUERY_LOG_SLOW))
|
||||||
init_slow_log(log_output_options);
|
{
|
||||||
opt_slow_log= TRUE;
|
/* Error printed by open table in activate_log() */
|
||||||
|
res= TRUE;
|
||||||
|
file_log->close(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
init_slow_log(log_output_options);
|
||||||
|
opt_slow_log= TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case QUERY_LOG_GENERAL:
|
case QUERY_LOG_GENERAL:
|
||||||
if (!opt_log)
|
if (!opt_log)
|
||||||
{
|
{
|
||||||
if ((res= reopen_log_table(log_type)))
|
file_log= file_log_handler->get_mysql_log();
|
||||||
goto err;
|
|
||||||
file_log_handler->get_mysql_log()->
|
file_log->open_query_log(sys_var_general_log_path.value);
|
||||||
open_query_log(sys_var_general_log_path.value);
|
if (table_log_handler->activate_log(thd, QUERY_LOG_GENERAL))
|
||||||
init_general_log(log_output_options);
|
{
|
||||||
opt_log= TRUE;
|
/* Error printed by open table in activate_log() */
|
||||||
|
res= TRUE;
|
||||||
|
file_log->close(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
init_general_log(log_output_options);
|
||||||
|
opt_log= TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DBUG_ASSERT(0);
|
DBUG_ASSERT(0);
|
||||||
}
|
}
|
||||||
err:
|
|
||||||
unlock();
|
unlock();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -1158,23 +1148,17 @@ err:
|
|||||||
|
|
||||||
void LOGGER::deactivate_log_handler(THD *thd, uint log_type)
|
void LOGGER::deactivate_log_handler(THD *thd, uint log_type)
|
||||||
{
|
{
|
||||||
TABLE_LIST *table_list;
|
|
||||||
my_bool *tmp_opt= 0;
|
my_bool *tmp_opt= 0;
|
||||||
MYSQL_LOG *file_log;
|
MYSQL_LOG *file_log;
|
||||||
THD *log_thd;
|
|
||||||
|
|
||||||
switch (log_type) {
|
switch (log_type) {
|
||||||
case QUERY_LOG_SLOW:
|
case QUERY_LOG_SLOW:
|
||||||
table_list= &table_log_handler->slow_log;
|
|
||||||
tmp_opt= &opt_slow_log;
|
tmp_opt= &opt_slow_log;
|
||||||
file_log= file_log_handler->get_mysql_slow_log();
|
file_log= file_log_handler->get_mysql_slow_log();
|
||||||
log_thd= table_log_handler->slow_log_thd;
|
|
||||||
break;
|
break;
|
||||||
case QUERY_LOG_GENERAL:
|
case QUERY_LOG_GENERAL:
|
||||||
table_list= &table_log_handler->general_log;
|
|
||||||
tmp_opt= &opt_log;
|
tmp_opt= &opt_log;
|
||||||
file_log= file_log_handler->get_mysql_log();
|
file_log= file_log_handler->get_mysql_log();
|
||||||
log_thd= table_log_handler->general_log_thd;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0); // Impossible
|
assert(0); // Impossible
|
||||||
@ -1183,81 +1167,16 @@ void LOGGER::deactivate_log_handler(THD *thd, uint log_type)
|
|||||||
if (!(*tmp_opt))
|
if (!(*tmp_opt))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (is_log_tables_initialized)
|
lock_exclusive();
|
||||||
lock_and_wait_for_table_name(log_thd, table_list);
|
|
||||||
lock();
|
|
||||||
|
|
||||||
if (is_log_tables_initialized)
|
|
||||||
{
|
|
||||||
VOID(pthread_mutex_lock(&LOCK_open));
|
|
||||||
close_log_table(log_type, TRUE);
|
|
||||||
table_list->table= 0;
|
|
||||||
query_cache_invalidate3(log_thd, table_list, 0);
|
|
||||||
unlock_table_name(log_thd, table_list);
|
|
||||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
|
||||||
}
|
|
||||||
file_log->close(0);
|
file_log->close(0);
|
||||||
*tmp_opt= FALSE;
|
*tmp_opt= FALSE;
|
||||||
unlock();
|
unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Close log tables temporarily. The thread which closed
|
|
||||||
them this way can lock them in any mode it needs.
|
|
||||||
NOTE: one should call logger.lock() before entering this
|
|
||||||
function.
|
|
||||||
*/
|
|
||||||
void Log_to_csv_event_handler::tmp_close_log_tables(THD *thd)
|
|
||||||
{
|
|
||||||
TABLE_LIST close_slow_log, close_general_log;
|
|
||||||
|
|
||||||
/* fill lists, we will need to perform operations on tables */
|
|
||||||
bzero((char*) &close_slow_log, sizeof(TABLE_LIST));
|
|
||||||
close_slow_log.alias= close_slow_log.table_name=(char*) "slow_log";
|
|
||||||
close_slow_log.table_name_length= 8;
|
|
||||||
close_slow_log.db= (char*) "mysql";
|
|
||||||
close_slow_log.db_length= 5;
|
|
||||||
|
|
||||||
bzero((char*) &close_general_log, sizeof(TABLE_LIST));
|
|
||||||
close_general_log.alias= close_general_log.table_name=(char*) "general_log";
|
|
||||||
close_general_log.table_name_length= 11;
|
|
||||||
close_general_log.db= (char*) "mysql";
|
|
||||||
close_general_log.db_length= 5;
|
|
||||||
|
|
||||||
privileged_thread= thd;
|
|
||||||
|
|
||||||
VOID(pthread_mutex_lock(&LOCK_open));
|
|
||||||
/*
|
|
||||||
NOTE: in fact, the first parameter used in query_cache_invalidate3()
|
|
||||||
could be any non-NULL THD, as the underlying code makes certain
|
|
||||||
assumptions about this.
|
|
||||||
Here we use one of the logger handler THD's. Simply because it
|
|
||||||
seems appropriate.
|
|
||||||
*/
|
|
||||||
if (opt_log)
|
|
||||||
{
|
|
||||||
close_log_table(QUERY_LOG_GENERAL, TRUE);
|
|
||||||
query_cache_invalidate3(general_log_thd, &close_general_log, 0);
|
|
||||||
}
|
|
||||||
if (opt_slow_log)
|
|
||||||
{
|
|
||||||
close_log_table(QUERY_LOG_SLOW, TRUE);
|
|
||||||
query_cache_invalidate3(general_log_thd, &close_slow_log, 0);
|
|
||||||
}
|
|
||||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the parameters are unused for the log tables */
|
/* the parameters are unused for the log tables */
|
||||||
bool Log_to_csv_event_handler::init()
|
bool Log_to_csv_event_handler::init()
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
we use | and not || here, to ensure that both open_log_table
|
|
||||||
are called, even if the first one fails
|
|
||||||
*/
|
|
||||||
if ((opt_log && open_log_table(QUERY_LOG_GENERAL)) |
|
|
||||||
(opt_slow_log && open_log_table(QUERY_LOG_SLOW)))
|
|
||||||
return 1;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1268,7 +1187,7 @@ int LOGGER::set_handlers(uint error_log_printer,
|
|||||||
/* error log table is not supported yet */
|
/* error log table is not supported yet */
|
||||||
DBUG_ASSERT(error_log_printer < LOG_TABLE);
|
DBUG_ASSERT(error_log_printer < LOG_TABLE);
|
||||||
|
|
||||||
lock();
|
lock_exclusive();
|
||||||
|
|
||||||
if ((slow_log_printer & LOG_TABLE || general_log_printer & LOG_TABLE) &&
|
if ((slow_log_printer & LOG_TABLE || general_log_printer & LOG_TABLE) &&
|
||||||
!is_log_tables_initialized)
|
!is_log_tables_initialized)
|
||||||
@ -1290,72 +1209,6 @@ int LOGGER::set_handlers(uint error_log_printer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Close log table of a given type (general or slow log)
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
close_log_table()
|
|
||||||
|
|
||||||
log_table_type type of the log table to close: QUERY_LOG_GENERAL
|
|
||||||
or QUERY_LOG_SLOW
|
|
||||||
lock_in_use Set to TRUE if the caller owns LOCK_open. FALSE otherwise.
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
|
|
||||||
The function closes a log table. It is invoked (1) when we need to reopen
|
|
||||||
log tables (e.g. FLUSH LOGS or TRUNCATE on the log table is being
|
|
||||||
executed) or (2) during shutdown.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void Log_to_csv_event_handler::
|
|
||||||
close_log_table(uint log_table_type, bool lock_in_use)
|
|
||||||
{
|
|
||||||
THD *log_thd, *curr= current_thd;
|
|
||||||
TABLE_LIST *table;
|
|
||||||
|
|
||||||
if (!logger.is_log_table_enabled(log_table_type))
|
|
||||||
return; /* do nothing */
|
|
||||||
|
|
||||||
switch (log_table_type) {
|
|
||||||
case QUERY_LOG_GENERAL:
|
|
||||||
log_thd= general_log_thd;
|
|
||||||
table= &general_log;
|
|
||||||
break;
|
|
||||||
case QUERY_LOG_SLOW:
|
|
||||||
log_thd= slow_log_thd;
|
|
||||||
table= &slow_log;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0); // Impossible
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Set thread stack start for the logger thread. See comment in
|
|
||||||
open_log_table() for details.
|
|
||||||
*/
|
|
||||||
if (curr)
|
|
||||||
log_thd->thread_stack= curr->thread_stack;
|
|
||||||
else
|
|
||||||
log_thd->thread_stack= (char*) &log_thd;
|
|
||||||
|
|
||||||
/* close the table */
|
|
||||||
log_thd->store_globals();
|
|
||||||
table->table->file->ha_rnd_end();
|
|
||||||
table->table->file->ha_release_auto_increment();
|
|
||||||
/* discard logger mark before unlock*/
|
|
||||||
table->table->locked_by_logger= FALSE;
|
|
||||||
close_thread_tables(log_thd, lock_in_use);
|
|
||||||
|
|
||||||
if (curr)
|
|
||||||
curr->store_globals();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
my_pthread_setspecific_ptr(THR_THD, 0);
|
|
||||||
my_pthread_setspecific_ptr(THR_MALLOC, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Save position of binary log transaction cache.
|
Save position of binary log transaction cache.
|
||||||
|
|
||||||
@ -2097,6 +1950,8 @@ bool MYSQL_QUERY_LOG::write(time_t event_time, const char *user_host,
|
|||||||
struct tm start;
|
struct tm start;
|
||||||
uint time_buff_len= 0;
|
uint time_buff_len= 0;
|
||||||
|
|
||||||
|
(void) pthread_mutex_lock(&LOCK_log);
|
||||||
|
|
||||||
/* Test if someone closed between the is_open test and lock */
|
/* Test if someone closed between the is_open test and lock */
|
||||||
if (is_open())
|
if (is_open())
|
||||||
{
|
{
|
||||||
@ -2141,6 +1996,7 @@ bool MYSQL_QUERY_LOG::write(time_t event_time, const char *user_host,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
(void) pthread_mutex_unlock(&LOCK_log);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
err:
|
err:
|
||||||
|
|
||||||
@ -2149,6 +2005,7 @@ err:
|
|||||||
write_error= 1;
|
write_error= 1;
|
||||||
sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno);
|
sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno);
|
||||||
}
|
}
|
||||||
|
(void) pthread_mutex_unlock(&LOCK_log);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2191,8 +2048,13 @@ bool MYSQL_QUERY_LOG::write(THD *thd, time_t current_time,
|
|||||||
bool error= 0;
|
bool error= 0;
|
||||||
DBUG_ENTER("MYSQL_QUERY_LOG::write");
|
DBUG_ENTER("MYSQL_QUERY_LOG::write");
|
||||||
|
|
||||||
|
(void) pthread_mutex_lock(&LOCK_log);
|
||||||
|
|
||||||
if (!is_open())
|
if (!is_open())
|
||||||
|
{
|
||||||
|
(void) pthread_mutex_unlock(&LOCK_log);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
if (is_open())
|
if (is_open())
|
||||||
{ // Safety agains reopen
|
{ // Safety agains reopen
|
||||||
@ -2296,6 +2158,7 @@ bool MYSQL_QUERY_LOG::write(THD *thd, time_t current_time,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
(void) pthread_mutex_unlock(&LOCK_log);
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
90
sql/log.h
90
sql/log.h
@ -212,6 +212,7 @@ public:
|
|||||||
return open(generate_name(log_name, ".log", 0, buf), LOG_NORMAL, 0,
|
return open(generate_name(log_name, ".log", 0, buf), LOG_NORMAL, 0,
|
||||||
WRITE_CACHE);
|
WRITE_CACHE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
time_t last_time;
|
time_t last_time;
|
||||||
};
|
};
|
||||||
@ -398,7 +399,7 @@ public:
|
|||||||
const char *sql_text, uint sql_text_len)= 0;
|
const char *sql_text, uint sql_text_len)= 0;
|
||||||
virtual bool log_error(enum loglevel level, const char *format,
|
virtual bool log_error(enum loglevel level, const char *format,
|
||||||
va_list args)= 0;
|
va_list args)= 0;
|
||||||
virtual bool log_general(time_t event_time, const char *user_host,
|
virtual bool log_general(THD *thd, time_t event_time, const char *user_host,
|
||||||
uint user_host_len, int thread_id,
|
uint user_host_len, int thread_id,
|
||||||
const char *command_type, uint command_type_len,
|
const char *command_type, uint command_type_len,
|
||||||
const char *sql_text, uint sql_text_len,
|
const char *sql_text, uint sql_text_len,
|
||||||
@ -412,27 +413,7 @@ int check_if_log_table(uint db_len, const char *db, uint table_name_len,
|
|||||||
|
|
||||||
class Log_to_csv_event_handler: public Log_event_handler
|
class Log_to_csv_event_handler: public Log_event_handler
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
We create artificial THD for each of the logs. This is to avoid
|
|
||||||
locking issues: we don't want locks on the log tables reside in the
|
|
||||||
THD's of the query. The reason is the locking order and duration.
|
|
||||||
*/
|
|
||||||
THD *general_log_thd, *slow_log_thd;
|
|
||||||
/*
|
|
||||||
This is for the thread, which called tmp_close_log_tables. The thread
|
|
||||||
will be allowed to write-lock the log tables (as it explicitly disabled
|
|
||||||
logging). This is used for such operations as REPAIR, which require
|
|
||||||
exclusive lock on the log tables.
|
|
||||||
NOTE: there can be only one priviliged thread, as one should
|
|
||||||
lock logger with logger.lock() before calling tmp_close_log_tables().
|
|
||||||
So no other thread could get privileged status at the same time.
|
|
||||||
*/
|
|
||||||
THD *privileged_thread;
|
|
||||||
friend class LOGGER;
|
friend class LOGGER;
|
||||||
TABLE_LIST general_log, slow_log;
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool open_log_table(uint log_type);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Log_to_csv_event_handler();
|
Log_to_csv_event_handler();
|
||||||
@ -447,18 +428,13 @@ public:
|
|||||||
const char *sql_text, uint sql_text_len);
|
const char *sql_text, uint sql_text_len);
|
||||||
virtual bool log_error(enum loglevel level, const char *format,
|
virtual bool log_error(enum loglevel level, const char *format,
|
||||||
va_list args);
|
va_list args);
|
||||||
virtual bool log_general(time_t event_time, const char *user_host,
|
virtual bool log_general(THD *thd, time_t event_time, const char *user_host,
|
||||||
uint user_host_len, int thread_id,
|
uint user_host_len, int thread_id,
|
||||||
const char *command_type, uint command_type_len,
|
const char *command_type, uint command_type_len,
|
||||||
const char *sql_text, uint sql_text_len,
|
const char *sql_text, uint sql_text_len,
|
||||||
CHARSET_INFO *client_cs);
|
CHARSET_INFO *client_cs);
|
||||||
void tmp_close_log_tables(THD *thd);
|
|
||||||
void close_log_table(uint log_type, bool lock_in_use);
|
int activate_log(THD *thd, uint log_type);
|
||||||
bool reopen_log_table(uint log_type);
|
|
||||||
THD* get_privileged_thread()
|
|
||||||
{
|
|
||||||
return privileged_thread;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -484,7 +460,7 @@ public:
|
|||||||
const char *sql_text, uint sql_text_len);
|
const char *sql_text, uint sql_text_len);
|
||||||
virtual bool log_error(enum loglevel level, const char *format,
|
virtual bool log_error(enum loglevel level, const char *format,
|
||||||
va_list args);
|
va_list args);
|
||||||
virtual bool log_general(time_t event_time, const char *user_host,
|
virtual bool log_general(THD *thd, time_t event_time, const char *user_host,
|
||||||
uint user_host_len, int thread_id,
|
uint user_host_len, int thread_id,
|
||||||
const char *command_type, uint command_type_len,
|
const char *command_type, uint command_type_len,
|
||||||
const char *sql_text, uint sql_text_len,
|
const char *sql_text, uint sql_text_len,
|
||||||
@ -499,7 +475,7 @@ public:
|
|||||||
/* Class which manages slow, general and error log event handlers */
|
/* Class which manages slow, general and error log event handlers */
|
||||||
class LOGGER
|
class LOGGER
|
||||||
{
|
{
|
||||||
pthread_mutex_t LOCK_logger;
|
rw_lock_t LOCK_logger;
|
||||||
/* flag to check whether logger mutex is initialized */
|
/* flag to check whether logger mutex is initialized */
|
||||||
uint inited;
|
uint inited;
|
||||||
|
|
||||||
@ -519,21 +495,10 @@ public:
|
|||||||
LOGGER() : inited(0), table_log_handler(NULL),
|
LOGGER() : inited(0), table_log_handler(NULL),
|
||||||
file_log_handler(NULL), is_log_tables_initialized(FALSE)
|
file_log_handler(NULL), is_log_tables_initialized(FALSE)
|
||||||
{}
|
{}
|
||||||
void lock() { (void) pthread_mutex_lock(&LOCK_logger); }
|
void lock_shared() { rw_rdlock(&LOCK_logger); }
|
||||||
void unlock() { (void) pthread_mutex_unlock(&LOCK_logger); }
|
void lock_exclusive() { rw_wrlock(&LOCK_logger); }
|
||||||
void tmp_close_log_tables(THD *thd);
|
void unlock() { rw_unlock(&LOCK_logger); }
|
||||||
bool is_log_table_enabled(uint log_table_type)
|
bool is_log_table_enabled(uint log_table_type);
|
||||||
{
|
|
||||||
switch (log_table_type) {
|
|
||||||
case QUERY_LOG_SLOW:
|
|
||||||
return table_log_handler && table_log_handler->slow_log.table != 0;
|
|
||||||
case QUERY_LOG_GENERAL:
|
|
||||||
return table_log_handler && table_log_handler->general_log.table != 0;
|
|
||||||
default:
|
|
||||||
DBUG_ASSERT(0);
|
|
||||||
return FALSE; /* make compiler happy */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
We want to initialize all log mutexes as soon as possible,
|
We want to initialize all log mutexes as soon as possible,
|
||||||
but we cannot do it in constructor, as safe_mutex relies on
|
but we cannot do it in constructor, as safe_mutex relies on
|
||||||
@ -543,20 +508,6 @@ public:
|
|||||||
void init_base();
|
void init_base();
|
||||||
void init_log_tables();
|
void init_log_tables();
|
||||||
bool flush_logs(THD *thd);
|
bool flush_logs(THD *thd);
|
||||||
THD *get_general_log_thd()
|
|
||||||
{
|
|
||||||
if (table_log_handler)
|
|
||||||
return (THD *) table_log_handler->general_log_thd;
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
THD *get_slow_log_thd()
|
|
||||||
{
|
|
||||||
if (table_log_handler)
|
|
||||||
return (THD *) table_log_handler->slow_log_thd;
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/* Perform basic logger cleanup. this will leave e.g. error log open. */
|
/* Perform basic logger cleanup. this will leave e.g. error log open. */
|
||||||
void cleanup_base();
|
void cleanup_base();
|
||||||
/* Free memory. Nothing could be logged after this function is called */
|
/* Free memory. Nothing could be logged after this function is called */
|
||||||
@ -568,10 +519,6 @@ public:
|
|||||||
bool general_log_print(THD *thd,enum enum_server_command command,
|
bool general_log_print(THD *thd,enum enum_server_command command,
|
||||||
const char *format, va_list args);
|
const char *format, va_list args);
|
||||||
|
|
||||||
void close_log_table(uint log_type, bool lock_in_use);
|
|
||||||
bool reopen_log_table(uint log_type);
|
|
||||||
bool reopen_log_tables();
|
|
||||||
|
|
||||||
/* we use this function to setup all enabled log event handlers */
|
/* we use this function to setup all enabled log event handlers */
|
||||||
int set_handlers(uint error_log_printer,
|
int set_handlers(uint error_log_printer,
|
||||||
uint slow_log_printer,
|
uint slow_log_printer,
|
||||||
@ -593,19 +540,6 @@ public:
|
|||||||
return file_log_handler->get_mysql_log();
|
return file_log_handler->get_mysql_log();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
THD* get_privileged_thread()
|
|
||||||
{
|
|
||||||
if (table_log_handler)
|
|
||||||
return table_log_handler->get_privileged_thread();
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
bool is_privileged_thread(THD *thd)
|
|
||||||
{
|
|
||||||
return thd == get_general_log_thd() ||
|
|
||||||
thd == get_slow_log_thd() ||
|
|
||||||
thd == get_privileged_thread();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum enum_binlog_format {
|
enum enum_binlog_format {
|
||||||
|
@ -944,6 +944,7 @@ void mysql_parse(THD *thd, const char *inBuf, uint length,
|
|||||||
|
|
||||||
bool mysql_test_parse_for_slave(THD *thd,char *inBuf,uint length);
|
bool mysql_test_parse_for_slave(THD *thd,char *inBuf,uint length);
|
||||||
bool is_update_query(enum enum_sql_command command);
|
bool is_update_query(enum enum_sql_command command);
|
||||||
|
bool is_log_table_write_query(enum enum_sql_command command);
|
||||||
bool alloc_query(THD *thd, const char *packet, uint packet_length);
|
bool alloc_query(THD *thd, const char *packet, uint packet_length);
|
||||||
void mysql_init_select(LEX *lex);
|
void mysql_init_select(LEX *lex);
|
||||||
void mysql_reset_thd_for_next_command(THD *thd);
|
void mysql_reset_thd_for_next_command(THD *thd);
|
||||||
@ -1123,7 +1124,8 @@ TABLE_SHARE *get_table_share(THD *thd, TABLE_LIST *table_list, char *key,
|
|||||||
uint key_length, uint db_flags, int *error);
|
uint key_length, uint db_flags, int *error);
|
||||||
void release_table_share(TABLE_SHARE *share, enum release_type type);
|
void release_table_share(TABLE_SHARE *share, enum release_type type);
|
||||||
TABLE_SHARE *get_cached_table_share(const char *db, const char *table_name);
|
TABLE_SHARE *get_cached_table_share(const char *db, const char *table_name);
|
||||||
TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type update);
|
TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type update,
|
||||||
|
uint lock_flags);
|
||||||
TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT* mem,
|
TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT* mem,
|
||||||
bool *refresh, uint flags);
|
bool *refresh, uint flags);
|
||||||
bool reopen_name_locked_table(THD* thd, TABLE_LIST* table_list, bool link_in);
|
bool reopen_name_locked_table(THD* thd, TABLE_LIST* table_list, bool link_in);
|
||||||
@ -1231,6 +1233,11 @@ void reset_status_vars();
|
|||||||
|
|
||||||
/* information schema */
|
/* information schema */
|
||||||
extern LEX_STRING INFORMATION_SCHEMA_NAME;
|
extern LEX_STRING INFORMATION_SCHEMA_NAME;
|
||||||
|
/* log tables */
|
||||||
|
extern LEX_STRING MYSQL_SCHEMA_NAME;
|
||||||
|
extern LEX_STRING GENERAL_LOG_NAME;
|
||||||
|
extern LEX_STRING SLOW_LOG_NAME;
|
||||||
|
|
||||||
extern const LEX_STRING partition_keywords[];
|
extern const LEX_STRING partition_keywords[];
|
||||||
ST_SCHEMA_TABLE *find_schema_table(THD *thd, const char* table_name);
|
ST_SCHEMA_TABLE *find_schema_table(THD *thd, const char* table_name);
|
||||||
ST_SCHEMA_TABLE *get_schema_table(enum enum_schema_tables schema_table_idx);
|
ST_SCHEMA_TABLE *get_schema_table(enum enum_schema_tables schema_table_idx);
|
||||||
@ -1557,6 +1564,10 @@ bool open_system_tables_for_read(THD *thd, TABLE_LIST *table_list,
|
|||||||
void close_system_tables(THD *thd, Open_tables_state *backup);
|
void close_system_tables(THD *thd, Open_tables_state *backup);
|
||||||
TABLE *open_system_table_for_update(THD *thd, TABLE_LIST *one_table);
|
TABLE *open_system_table_for_update(THD *thd, TABLE_LIST *one_table);
|
||||||
|
|
||||||
|
TABLE *open_performance_schema_table(THD *thd, TABLE_LIST *one_table,
|
||||||
|
Open_tables_state *backup);
|
||||||
|
void close_performance_schema_table(THD *thd, Open_tables_state *backup);
|
||||||
|
|
||||||
bool close_cached_tables(THD *thd, bool wait_for_refresh, TABLE_LIST *tables, bool have_lock = FALSE);
|
bool close_cached_tables(THD *thd, bool wait_for_refresh, TABLE_LIST *tables, bool have_lock = FALSE);
|
||||||
bool close_cached_connection_tables(THD *thd, bool wait_for_refresh,
|
bool close_cached_connection_tables(THD *thd, bool wait_for_refresh,
|
||||||
LEX_STRING *connect_string,
|
LEX_STRING *connect_string,
|
||||||
@ -1891,11 +1902,13 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **table, uint count,
|
|||||||
#define MYSQL_LOCK_NOTIFY_IF_NEED_REOPEN 0x0004
|
#define MYSQL_LOCK_NOTIFY_IF_NEED_REOPEN 0x0004
|
||||||
#define MYSQL_OPEN_TEMPORARY_ONLY 0x0008
|
#define MYSQL_OPEN_TEMPORARY_ONLY 0x0008
|
||||||
#define MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY 0x0010
|
#define MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY 0x0010
|
||||||
|
#define MYSQL_LOCK_PERF_SCHEMA 0x0020
|
||||||
|
|
||||||
void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock);
|
void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock);
|
||||||
void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock);
|
void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock);
|
||||||
void mysql_unlock_some_tables(THD *thd, TABLE **table,uint count);
|
void mysql_unlock_some_tables(THD *thd, TABLE **table,uint count);
|
||||||
void mysql_lock_remove(THD *thd, MYSQL_LOCK *locked,TABLE *table);
|
void mysql_lock_remove(THD *thd, MYSQL_LOCK *locked,TABLE *table,
|
||||||
|
bool always_unlock);
|
||||||
void mysql_lock_abort(THD *thd, TABLE *table, bool upgrade_lock);
|
void mysql_lock_abort(THD *thd, TABLE *table, bool upgrade_lock);
|
||||||
void mysql_lock_downgrade_write(THD *thd, TABLE *table,
|
void mysql_lock_downgrade_write(THD *thd, TABLE *table,
|
||||||
thr_lock_type new_lock_type);
|
thr_lock_type new_lock_type);
|
||||||
|
@ -2053,21 +2053,15 @@ end:
|
|||||||
|
|
||||||
bool sys_var_log_state::update(THD *thd, set_var *var)
|
bool sys_var_log_state::update(THD *thd, set_var *var)
|
||||||
{
|
{
|
||||||
bool res= 0;
|
bool res;
|
||||||
pthread_mutex_lock(&LOCK_global_system_variables);
|
pthread_mutex_lock(&LOCK_global_system_variables);
|
||||||
if (!var->save_result.ulong_value)
|
if (!var->save_result.ulong_value)
|
||||||
logger.deactivate_log_handler(thd, log_type);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if ((res= logger.activate_log_handler(thd, log_type)))
|
logger.deactivate_log_handler(thd, log_type);
|
||||||
{
|
res= false;
|
||||||
my_error(ER_CANT_ACTIVATE_LOG, MYF(0),
|
|
||||||
log_type == QUERY_LOG_GENERAL ? "general" :
|
|
||||||
"slow query");
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
err:
|
else
|
||||||
|
res= logger.activate_log_handler(thd, log_type);
|
||||||
pthread_mutex_unlock(&LOCK_global_system_variables);
|
pthread_mutex_unlock(&LOCK_global_system_variables);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -2143,7 +2137,7 @@ bool update_sys_var_str_path(THD *thd, sys_var_str *var_str,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&LOCK_global_system_variables);
|
pthread_mutex_lock(&LOCK_global_system_variables);
|
||||||
logger.lock();
|
logger.lock_exclusive();
|
||||||
|
|
||||||
if (file_log && log_state)
|
if (file_log && log_state)
|
||||||
file_log->close(0);
|
file_log->close(0);
|
||||||
@ -2206,7 +2200,7 @@ static void sys_default_slow_log_path(THD *thd, enum_var_type type)
|
|||||||
bool sys_var_log_output::update(THD *thd, set_var *var)
|
bool sys_var_log_output::update(THD *thd, set_var *var)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&LOCK_global_system_variables);
|
pthread_mutex_lock(&LOCK_global_system_variables);
|
||||||
logger.lock();
|
logger.lock_exclusive();
|
||||||
logger.init_slow_log(var->save_result.ulong_value);
|
logger.init_slow_log(var->save_result.ulong_value);
|
||||||
logger.init_general_log(var->save_result.ulong_value);
|
logger.init_general_log(var->save_result.ulong_value);
|
||||||
*value= var->save_result.ulong_value;
|
*value= var->save_result.ulong_value;
|
||||||
@ -2219,7 +2213,7 @@ bool sys_var_log_output::update(THD *thd, set_var *var)
|
|||||||
void sys_var_log_output::set_default(THD *thd, enum_var_type type)
|
void sys_var_log_output::set_default(THD *thd, enum_var_type type)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&LOCK_global_system_variables);
|
pthread_mutex_lock(&LOCK_global_system_variables);
|
||||||
logger.lock();
|
logger.lock_exclusive();
|
||||||
logger.init_slow_log(LOG_FILE);
|
logger.init_slow_log(LOG_FILE);
|
||||||
logger.init_general_log(LOG_FILE);
|
logger.init_general_log(LOG_FILE);
|
||||||
*value= LOG_FILE;
|
*value= LOG_FILE;
|
||||||
|
@ -5936,8 +5936,8 @@ ER_WARN_DEPRECATED_SYNTAX_WITH_VER
|
|||||||
ER_CANT_WRITE_LOCK_LOG_TABLE
|
ER_CANT_WRITE_LOCK_LOG_TABLE
|
||||||
eng "You can't write-lock a log table. Only read access is possible"
|
eng "You can't write-lock a log table. Only read access is possible"
|
||||||
ger "Eine Log-Tabelle kann nicht schreibgesperrt werden. Es ist ohnehin nur Lesezugriff möglich"
|
ger "Eine Log-Tabelle kann nicht schreibgesperrt werden. Es ist ohnehin nur Lesezugriff möglich"
|
||||||
ER_CANT_READ_LOCK_LOG_TABLE
|
ER_CANT_LOCK_LOG_TABLE
|
||||||
eng "You can't use usual read lock with log tables. Try READ LOCAL instead"
|
eng "You can't use locks with log tables."
|
||||||
ger "Log-Tabellen können nicht mit normalen Lesesperren gesperrt werden. Verwenden Sie statt dessen READ LOCAL"
|
ger "Log-Tabellen können nicht mit normalen Lesesperren gesperrt werden. Verwenden Sie statt dessen READ LOCAL"
|
||||||
ER_FOREIGN_DUPLICATE_KEY 23000 S1009
|
ER_FOREIGN_DUPLICATE_KEY 23000 S1009
|
||||||
eng "Upholding foreign key constraints for table '%.192s', entry '%-.192s', key %d would lead to a duplicate entry"
|
eng "Upholding foreign key constraints for table '%.192s', entry '%-.192s', key %d would lead to a duplicate entry"
|
||||||
|
@ -977,7 +977,7 @@ static int create_table_from_dump(THD* thd, MYSQL *mysql, const char* db,
|
|||||||
|
|
||||||
thd->proc_info = "Opening master dump table";
|
thd->proc_info = "Opening master dump table";
|
||||||
tables.lock_type = TL_WRITE;
|
tables.lock_type = TL_WRITE;
|
||||||
if (!open_ltable(thd, &tables, TL_WRITE))
|
if (!open_ltable(thd, &tables, TL_WRITE, 0))
|
||||||
{
|
{
|
||||||
sql_print_error("create_table_from_dump: could not open created table");
|
sql_print_error("create_table_from_dump: could not open created table");
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -406,7 +406,7 @@ db_find_routine(THD *thd, int type, sp_name *name, sp_head **sphp)
|
|||||||
if ((ret= db_find_routine_aux(thd, type, name, table)) != SP_OK)
|
if ((ret= db_find_routine_aux(thd, type, name, table)) != SP_OK)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
if (table->s->fields != MYSQL_PROC_FIELD_COUNT)
|
if (table->s->fields < MYSQL_PROC_FIELD_COUNT)
|
||||||
{
|
{
|
||||||
ret= SP_GET_FIELD_FAILED;
|
ret= SP_GET_FIELD_FAILED;
|
||||||
goto done;
|
goto done;
|
||||||
@ -695,7 +695,7 @@ sp_create_routine(THD *thd, int type, sp_head *sp)
|
|||||||
strxnmov(definer, sizeof(definer)-1, thd->lex->definer->user.str, "@",
|
strxnmov(definer, sizeof(definer)-1, thd->lex->definer->user.str, "@",
|
||||||
thd->lex->definer->host.str, NullS);
|
thd->lex->definer->host.str, NullS);
|
||||||
|
|
||||||
if (table->s->fields != MYSQL_PROC_FIELD_COUNT)
|
if (table->s->fields < MYSQL_PROC_FIELD_COUNT)
|
||||||
{
|
{
|
||||||
ret= SP_GET_FIELD_FAILED;
|
ret= SP_GET_FIELD_FAILED;
|
||||||
goto done;
|
goto done;
|
||||||
@ -1067,7 +1067,7 @@ sp_show_status_routine(THD *thd, int type, const char *name_pattern)
|
|||||||
tables.db= (char*)"mysql";
|
tables.db= (char*)"mysql";
|
||||||
tables.table_name= tables.alias= (char*)"proc";
|
tables.table_name= tables.alias= (char*)"proc";
|
||||||
|
|
||||||
if (! (table= open_ltable(thd, &tables, TL_READ)))
|
if (! (table= open_ltable(thd, &tables, TL_READ, 0)))
|
||||||
{
|
{
|
||||||
res= SP_OPEN_TABLE_FAILED;
|
res= SP_OPEN_TABLE_FAILED;
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -1602,7 +1602,7 @@ bool change_password(THD *thd, const char *host, const char *user,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!(table= open_ltable(thd, &tables, TL_WRITE)))
|
if (!(table= open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
|
||||||
VOID(pthread_mutex_lock(&acl_cache->lock));
|
VOID(pthread_mutex_lock(&acl_cache->lock));
|
||||||
|
177
sql/sql_base.cc
177
sql/sql_base.cc
@ -902,8 +902,7 @@ bool close_cached_tables(THD *thd, bool if_wait_for_refresh,
|
|||||||
bool found=0;
|
bool found=0;
|
||||||
for (TABLE_LIST *table= tables; table; table= table->next_local)
|
for (TABLE_LIST *table= tables; table; table= table->next_local)
|
||||||
{
|
{
|
||||||
if ((!table->table || !table->table->s->log_table) &&
|
if (remove_table_from_cache(thd, table->db, table->table_name,
|
||||||
remove_table_from_cache(thd, table->db, table->table_name,
|
|
||||||
RTFC_OWNED_BY_THD_FLAG))
|
RTFC_OWNED_BY_THD_FLAG))
|
||||||
found=1;
|
found=1;
|
||||||
}
|
}
|
||||||
@ -951,8 +950,7 @@ bool close_cached_tables(THD *thd, bool if_wait_for_refresh,
|
|||||||
are employed by CREATE TABLE as in this case table simply does not
|
are employed by CREATE TABLE as in this case table simply does not
|
||||||
exist yet.
|
exist yet.
|
||||||
*/
|
*/
|
||||||
if (!table->s->log_table &&
|
if (table->needs_reopen_or_name_lock() && table->db_stat)
|
||||||
(table->needs_reopen_or_name_lock() && table->db_stat))
|
|
||||||
{
|
{
|
||||||
found=1;
|
found=1;
|
||||||
DBUG_PRINT("signal", ("Waiting for COND_refresh"));
|
DBUG_PRINT("signal", ("Waiting for COND_refresh"));
|
||||||
@ -1679,8 +1677,28 @@ TABLE *find_temporary_table(THD *thd, TABLE_LIST *table_list)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
Close temporary table and unlink from thd->temporary tables
|
Drop a temporary table.
|
||||||
|
|
||||||
|
Try to locate the table in the list of thd->temporary_tables.
|
||||||
|
If the table is found:
|
||||||
|
- if the table is in thd->locked_tables, unlock it and
|
||||||
|
remove it from the list of locked tables. Currently only transactional
|
||||||
|
temporary tables are present in the locked_tables list.
|
||||||
|
- Close the temporary table, remove its .FRM
|
||||||
|
- remove the table from the list of temporary tables
|
||||||
|
|
||||||
|
This function is used to drop user temporary tables, as well as
|
||||||
|
internal tables created in CREATE TEMPORARY TABLE ... SELECT
|
||||||
|
or ALTER TABLE. Even though part of the work done by this function
|
||||||
|
is redundant when the table is internal, as long as we
|
||||||
|
link both internal and user temporary tables into the same
|
||||||
|
thd->temporary_tables list, it's impossible to tell here whether
|
||||||
|
we're dealing with an internal or a user temporary table.
|
||||||
|
|
||||||
|
@retval TRUE the table was not found in the list of temporary tables
|
||||||
|
of this thread
|
||||||
|
@retval FALSE the table was found and dropped successfully.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool close_temporary_table(THD *thd, TABLE_LIST *table_list)
|
bool close_temporary_table(THD *thd, TABLE_LIST *table_list)
|
||||||
@ -1689,6 +1707,11 @@ bool close_temporary_table(THD *thd, TABLE_LIST *table_list)
|
|||||||
|
|
||||||
if (!(table= find_temporary_table(thd, table_list)))
|
if (!(table= find_temporary_table(thd, table_list)))
|
||||||
return 1;
|
return 1;
|
||||||
|
/*
|
||||||
|
If LOCK TABLES list is not empty and contains this table,
|
||||||
|
unlock the table and remove the table from this list.
|
||||||
|
*/
|
||||||
|
mysql_lock_remove(thd, thd->locked_tables, table, FALSE);
|
||||||
close_temporary_table(thd, table, 1, 1);
|
close_temporary_table(thd, table, 1, 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1835,7 +1858,7 @@ void unlink_open_table(THD *thd, TABLE *find, bool unlock)
|
|||||||
!memcmp(list->s->table_cache_key.str, key, key_length))
|
!memcmp(list->s->table_cache_key.str, key, key_length))
|
||||||
{
|
{
|
||||||
if (unlock && thd->locked_tables)
|
if (unlock && thd->locked_tables)
|
||||||
mysql_lock_remove(thd, thd->locked_tables,list);
|
mysql_lock_remove(thd, thd->locked_tables, list, TRUE);
|
||||||
VOID(hash_delete(&open_cache,(uchar*) list)); // Close table
|
VOID(hash_delete(&open_cache,(uchar*) list)); // Close table
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1861,8 +1884,13 @@ void unlink_open_table(THD *thd, TABLE *find, bool unlock)
|
|||||||
|
|
||||||
@note This routine assumes that table to be closed is open only
|
@note This routine assumes that table to be closed is open only
|
||||||
by calling thread so we needn't wait until other threads
|
by calling thread so we needn't wait until other threads
|
||||||
will close the table. It also assumes that table to be
|
will close the table. Also unless called under implicit or
|
||||||
dropped is already unlocked.
|
explicit LOCK TABLES mode it assumes that table to be
|
||||||
|
dropped is already unlocked. In the former case it will
|
||||||
|
also remove lock on the table. But one should not rely on
|
||||||
|
this behaviour as it may change in future.
|
||||||
|
Currently, however, this function is never called for a
|
||||||
|
table that was locked with LOCK TABLES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void drop_open_table(THD *thd, TABLE *table, const char *db_name,
|
void drop_open_table(THD *thd, TABLE *table, const char *db_name,
|
||||||
@ -2468,8 +2496,7 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
|
|||||||
&state))
|
&state))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Here we flush tables marked for flush. However we never flush log
|
Here we flush tables marked for flush.
|
||||||
tables here. They are flushed only on FLUSH LOGS.
|
|
||||||
Normally, table->s->version contains the value of
|
Normally, table->s->version contains the value of
|
||||||
refresh_version from the moment when this table was
|
refresh_version from the moment when this table was
|
||||||
(re-)opened and added to the cache.
|
(re-)opened and added to the cache.
|
||||||
@ -2486,7 +2513,7 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
|
|||||||
c1: name lock t2; -- blocks
|
c1: name lock t2; -- blocks
|
||||||
c2: open t1; -- blocks
|
c2: open t1; -- blocks
|
||||||
*/
|
*/
|
||||||
if (table->needs_reopen_or_name_lock() && !table->s->log_table)
|
if (table->needs_reopen_or_name_lock())
|
||||||
{
|
{
|
||||||
DBUG_PRINT("note",
|
DBUG_PRINT("note",
|
||||||
("Found table '%s.%s' with different refresh version",
|
("Found table '%s.%s' with different refresh version",
|
||||||
@ -2840,7 +2867,7 @@ void close_data_files_and_morph_locks(THD *thd, const char *db,
|
|||||||
!strcmp(table->s->db.str, db))
|
!strcmp(table->s->db.str, db))
|
||||||
{
|
{
|
||||||
if (thd->locked_tables)
|
if (thd->locked_tables)
|
||||||
mysql_lock_remove(thd, thd->locked_tables, table);
|
mysql_lock_remove(thd, thd->locked_tables, table, TRUE);
|
||||||
table->open_placeholder= 1;
|
table->open_placeholder= 1;
|
||||||
close_handle_and_leave_table_as_lock(table);
|
close_handle_and_leave_table_as_lock(table);
|
||||||
}
|
}
|
||||||
@ -2962,10 +2989,9 @@ void close_old_data_files(THD *thd, TABLE *table, bool morph_locks,
|
|||||||
for (; table ; table=table->next)
|
for (; table ; table=table->next)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Reopen marked for flush. But close log tables. They are flushed only
|
Reopen marked for flush.
|
||||||
explicitly on FLUSH LOGS
|
|
||||||
*/
|
*/
|
||||||
if (table->needs_reopen_or_name_lock() && !table->s->log_table)
|
if (table->needs_reopen_or_name_lock())
|
||||||
{
|
{
|
||||||
found=1;
|
found=1;
|
||||||
if (table->db_stat)
|
if (table->db_stat)
|
||||||
@ -2979,7 +3005,7 @@ void close_old_data_files(THD *thd, TABLE *table, bool morph_locks,
|
|||||||
instances of this table.
|
instances of this table.
|
||||||
*/
|
*/
|
||||||
mysql_lock_abort(thd, table, TRUE);
|
mysql_lock_abort(thd, table, TRUE);
|
||||||
mysql_lock_remove(thd, thd->locked_tables, table);
|
mysql_lock_remove(thd, thd->locked_tables, table, TRUE);
|
||||||
/*
|
/*
|
||||||
We want to protect the table from concurrent DDL operations
|
We want to protect the table from concurrent DDL operations
|
||||||
(like RENAME TABLE) until we will re-open and re-lock it.
|
(like RENAME TABLE) until we will re-open and re-lock it.
|
||||||
@ -3012,10 +3038,6 @@ void close_old_data_files(THD *thd, TABLE *table, bool morph_locks,
|
|||||||
Wait until all threads has closed the tables in the list
|
Wait until all threads has closed the tables in the list
|
||||||
We have also to wait if there is thread that has a lock on this table even
|
We have also to wait if there is thread that has a lock on this table even
|
||||||
if the table is closed
|
if the table is closed
|
||||||
NOTE: log tables are handled differently by the logging routines.
|
|
||||||
E.g. general_log is always opened and locked by the logger
|
|
||||||
and the table handler used by the logger, will be skipped by
|
|
||||||
this check.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool table_is_used(TABLE *table, bool wait_for_name_lock)
|
bool table_is_used(TABLE *table, bool wait_for_name_lock)
|
||||||
@ -3034,10 +3056,10 @@ bool table_is_used(TABLE *table, bool wait_for_name_lock)
|
|||||||
search= (TABLE*) hash_next(&open_cache, (uchar*) key,
|
search= (TABLE*) hash_next(&open_cache, (uchar*) key,
|
||||||
key_length, &state))
|
key_length, &state))
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("share: 0x%lx locked_by_logger: %d "
|
DBUG_PRINT("info", ("share: 0x%lx "
|
||||||
"open_placeholder: %d locked_by_name: %d "
|
"open_placeholder: %d locked_by_name: %d "
|
||||||
"db_stat: %u version: %lu",
|
"db_stat: %u version: %lu",
|
||||||
(ulong) search->s, search->locked_by_logger,
|
(ulong) search->s,
|
||||||
search->open_placeholder, search->locked_by_name,
|
search->open_placeholder, search->locked_by_name,
|
||||||
search->db_stat,
|
search->db_stat,
|
||||||
search->s->version));
|
search->s->version));
|
||||||
@ -3049,12 +3071,9 @@ bool table_is_used(TABLE *table, bool wait_for_name_lock)
|
|||||||
- If we are in flush table and we didn't execute the flush
|
- If we are in flush table and we didn't execute the flush
|
||||||
- If the table engine is open and it's an old version
|
- If the table engine is open and it's an old version
|
||||||
(We must wait until all engines are shut down to use the table)
|
(We must wait until all engines are shut down to use the table)
|
||||||
However we fo not wait if we encountered a table, locked by the logger.
|
|
||||||
Log tables are managed separately by logging routines.
|
|
||||||
*/
|
*/
|
||||||
if (!search->locked_by_logger &&
|
if ( (search->locked_by_name && wait_for_name_lock) ||
|
||||||
(search->locked_by_name && wait_for_name_lock ||
|
(search->is_name_opened() && search->needs_reopen_or_name_lock()))
|
||||||
(search->is_name_opened() && search->needs_reopen_or_name_lock())))
|
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
} while ((table=table->next));
|
} while ((table=table->next));
|
||||||
@ -3131,7 +3150,7 @@ TABLE *drop_locked_tables(THD *thd,const char *db, const char *table_name)
|
|||||||
if (!strcmp(table->s->table_name.str, table_name) &&
|
if (!strcmp(table->s->table_name.str, table_name) &&
|
||||||
!strcmp(table->s->db.str, db))
|
!strcmp(table->s->db.str, db))
|
||||||
{
|
{
|
||||||
mysql_lock_remove(thd, thd->locked_tables,table);
|
mysql_lock_remove(thd, thd->locked_tables, table, TRUE);
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
found= table;
|
found= table;
|
||||||
@ -3766,6 +3785,7 @@ static bool check_lock_and_start_stmt(THD *thd, TABLE *table,
|
|||||||
thd Thread handler
|
thd Thread handler
|
||||||
table_list Table to open is first table in this list
|
table_list Table to open is first table in this list
|
||||||
lock_type Lock to use for open
|
lock_type Lock to use for open
|
||||||
|
lock_flags Flags passed to mysql_lock_table
|
||||||
|
|
||||||
NOTE
|
NOTE
|
||||||
This function don't do anything like SP/SF/views/triggers analysis done
|
This function don't do anything like SP/SF/views/triggers analysis done
|
||||||
@ -3781,7 +3801,8 @@ static bool check_lock_and_start_stmt(THD *thd, TABLE *table,
|
|||||||
table_list->table table
|
table_list->table table
|
||||||
*/
|
*/
|
||||||
|
|
||||||
TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type lock_type)
|
TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type lock_type,
|
||||||
|
uint lock_flags)
|
||||||
{
|
{
|
||||||
TABLE *table;
|
TABLE *table;
|
||||||
bool refresh;
|
bool refresh;
|
||||||
@ -3809,8 +3830,8 @@ TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type lock_type)
|
|||||||
{
|
{
|
||||||
DBUG_ASSERT(thd->lock == 0); // You must lock everything at once
|
DBUG_ASSERT(thd->lock == 0); // You must lock everything at once
|
||||||
if ((table->reginfo.lock_type= lock_type) != TL_UNLOCK)
|
if ((table->reginfo.lock_type= lock_type) != TL_UNLOCK)
|
||||||
if (! (thd->lock= mysql_lock_tables(thd, &table_list->table, 1, 0,
|
if (! (thd->lock= mysql_lock_tables(thd, &table_list->table, 1,
|
||||||
&refresh)))
|
lock_flags, &refresh)))
|
||||||
table= 0;
|
table= 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4149,11 +4170,6 @@ int lock_tables(THD *thd, TABLE_LIST *tables, uint count, bool *need_reopen)
|
|||||||
DBUG_ASSERT(thd->lock == 0); // You must lock everything at once
|
DBUG_ASSERT(thd->lock == 0); // You must lock everything at once
|
||||||
TABLE **start,**ptr;
|
TABLE **start,**ptr;
|
||||||
uint lock_flag= MYSQL_LOCK_NOTIFY_IF_NEED_REOPEN;
|
uint lock_flag= MYSQL_LOCK_NOTIFY_IF_NEED_REOPEN;
|
||||||
|
|
||||||
/* Ignore GLOBAL READ LOCK and GLOBAL READ_ONLY if called from a logger */
|
|
||||||
if (logger.is_privileged_thread(thd))
|
|
||||||
lock_flag|= (MYSQL_LOCK_IGNORE_GLOBAL_READ_LOCK |
|
|
||||||
MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY);
|
|
||||||
|
|
||||||
if (!(ptr=start=(TABLE**) thd->alloc(sizeof(TABLE*)*count)))
|
if (!(ptr=start=(TABLE**) thd->alloc(sizeof(TABLE*)*count)))
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
@ -7182,7 +7198,6 @@ bool remove_table_from_cache(THD *thd, const char *db, const char *table_name,
|
|||||||
else if (in_use != thd)
|
else if (in_use != thd)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("Table was in use by other thread"));
|
DBUG_PRINT("info", ("Table was in use by other thread"));
|
||||||
in_use->some_tables_deleted=1;
|
|
||||||
if (table->is_name_opened())
|
if (table->is_name_opened())
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("Found another active instance of the table"));
|
DBUG_PRINT("info", ("Found another active instance of the table"));
|
||||||
@ -7618,7 +7633,7 @@ open_system_tables_for_read(THD *thd, TABLE_LIST *table_list,
|
|||||||
if (!table)
|
if (!table)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
DBUG_ASSERT(table->s->system_table);
|
DBUG_ASSERT(table->s->table_category == TABLE_CATEGORY_SYSTEM);
|
||||||
|
|
||||||
table->use_all_columns();
|
table->use_all_columns();
|
||||||
table->reginfo.lock_type= tables->lock_type;
|
table->reginfo.lock_type= tables->lock_type;
|
||||||
@ -7685,12 +7700,92 @@ open_system_table_for_update(THD *thd, TABLE_LIST *one_table)
|
|||||||
{
|
{
|
||||||
DBUG_ENTER("open_system_table_for_update");
|
DBUG_ENTER("open_system_table_for_update");
|
||||||
|
|
||||||
TABLE *table= open_ltable(thd, one_table, one_table->lock_type);
|
TABLE *table= open_ltable(thd, one_table, one_table->lock_type, 0);
|
||||||
if (table)
|
if (table)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(table->s->system_table);
|
DBUG_ASSERT(table->s->table_category == TABLE_CATEGORY_SYSTEM);
|
||||||
table->use_all_columns();
|
table->use_all_columns();
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_RETURN(table);
|
DBUG_RETURN(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Open a performance schema table.
|
||||||
|
Opening such tables is performed internally in the server
|
||||||
|
implementation, and is a 'nested' open, since some tables
|
||||||
|
might be already opened by the current thread.
|
||||||
|
The thread context before this call is saved, and is restored
|
||||||
|
when calling close_performance_schema_table().
|
||||||
|
@param thd The current thread
|
||||||
|
@param one_table Performance schema table to open
|
||||||
|
@param backup [out] Temporary storage used to save the thread context
|
||||||
|
*/
|
||||||
|
TABLE *
|
||||||
|
open_performance_schema_table(THD *thd, TABLE_LIST *one_table,
|
||||||
|
Open_tables_state *backup)
|
||||||
|
{
|
||||||
|
uint flags= ( MYSQL_LOCK_IGNORE_GLOBAL_READ_LOCK
|
||||||
|
| MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY
|
||||||
|
| MYSQL_LOCK_PERF_SCHEMA );
|
||||||
|
|
||||||
|
DBUG_ENTER("open_performance_schema_table");
|
||||||
|
|
||||||
|
thd->reset_n_backup_open_tables_state(backup);
|
||||||
|
|
||||||
|
TABLE *table= open_ltable(thd, one_table, one_table->lock_type, flags);
|
||||||
|
if (table)
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(table->s->table_category == TABLE_CATEGORY_PERFORMANCE);
|
||||||
|
/* Make sure all columns get assigned to a default value */
|
||||||
|
table->use_all_columns();
|
||||||
|
table->no_replicate= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBUG_RETURN(table);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Close a performance schema table.
|
||||||
|
The last table opened by open_performance_schema_table()
|
||||||
|
is closed, then the thread context is restored.
|
||||||
|
@param thd The current thread
|
||||||
|
@param backup [in] the context to restore.
|
||||||
|
*/
|
||||||
|
void close_performance_schema_table(THD *thd, Open_tables_state *backup)
|
||||||
|
{
|
||||||
|
bool found_old_table;
|
||||||
|
|
||||||
|
if (thd->lock)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Note:
|
||||||
|
We do not create explicitly a separate transaction for the
|
||||||
|
performance table I/O, but borrow the current transaction.
|
||||||
|
lock + unlock will autocommit the change done in the
|
||||||
|
performance schema table: this is the expected result.
|
||||||
|
The current transaction should not be affected by this code.
|
||||||
|
TODO: Note that if a transactional engine is used for log tables,
|
||||||
|
this code will need to be revised, as a separate transaction
|
||||||
|
might be needed.
|
||||||
|
*/
|
||||||
|
mysql_unlock_tables(thd, thd->lock);
|
||||||
|
thd->lock= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
safe_mutex_assert_not_owner(&LOCK_open);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&LOCK_open);
|
||||||
|
|
||||||
|
found_old_table= false;
|
||||||
|
while (thd->open_tables)
|
||||||
|
found_old_table|= close_thread_table(thd, &thd->open_tables);
|
||||||
|
|
||||||
|
if (found_old_table)
|
||||||
|
broadcast_refresh();
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&LOCK_open);
|
||||||
|
|
||||||
|
thd->restore_backup_open_tables_state(backup);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -765,13 +765,25 @@ enum prelocked_mode_type {NON_PRELOCKED= 0, PRELOCKED= 1,
|
|||||||
class Open_tables_state
|
class Open_tables_state
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/*
|
/**
|
||||||
open_tables - list of regular tables in use by this thread
|
List of regular tables in use by this thread. Contains temporary and
|
||||||
temporary_tables - list of temp tables in use by this thread
|
base tables that were opened with @see open_tables().
|
||||||
handler_tables - list of tables that were opened with HANDLER OPEN
|
|
||||||
and are still in use by this thread
|
|
||||||
*/
|
*/
|
||||||
TABLE *open_tables, *temporary_tables, *handler_tables, *derived_tables;
|
TABLE *open_tables;
|
||||||
|
/**
|
||||||
|
List of temporary tables used by this thread. Contains user-level
|
||||||
|
temporary tables, created with CREATE TEMPORARY TABLE, and
|
||||||
|
internal temporary tables, created, e.g., to resolve a SELECT,
|
||||||
|
or for an intermediate table used in ALTER.
|
||||||
|
XXX Why are internal temporary tables added to this list?
|
||||||
|
*/
|
||||||
|
TABLE *temporary_tables;
|
||||||
|
/**
|
||||||
|
List of tables that were opened with HANDLER OPEN and are
|
||||||
|
still in use by this thread.
|
||||||
|
*/
|
||||||
|
TABLE *handler_tables;
|
||||||
|
TABLE *derived_tables;
|
||||||
/*
|
/*
|
||||||
During a MySQL session, one can lock tables in two modes: automatic
|
During a MySQL session, one can lock tables in two modes: automatic
|
||||||
or manual. In automatic mode all necessary tables are locked just before
|
or manual. In automatic mode all necessary tables are locked just before
|
||||||
@ -2438,6 +2450,7 @@ public:
|
|||||||
#define CF_HAS_ROW_COUNT 2
|
#define CF_HAS_ROW_COUNT 2
|
||||||
#define CF_STATUS_COMMAND 4
|
#define CF_STATUS_COMMAND 4
|
||||||
#define CF_SHOW_TABLE_COMMAND 8
|
#define CF_SHOW_TABLE_COMMAND 8
|
||||||
|
#define CF_WRITE_LOGS_COMMAND 16
|
||||||
|
|
||||||
/* Functions in sql_class.cc */
|
/* Functions in sql_class.cc */
|
||||||
|
|
||||||
|
@ -906,9 +906,7 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
|
|||||||
char path[FN_REFLEN];
|
char path[FN_REFLEN];
|
||||||
TABLE *table;
|
TABLE *table;
|
||||||
bool error;
|
bool error;
|
||||||
uint closed_log_tables= 0, lock_logger= 0;
|
|
||||||
uint path_length;
|
uint path_length;
|
||||||
uint log_type;
|
|
||||||
DBUG_ENTER("mysql_truncate");
|
DBUG_ENTER("mysql_truncate");
|
||||||
|
|
||||||
bzero((char*) &create_info,sizeof(create_info));
|
bzero((char*) &create_info,sizeof(create_info));
|
||||||
@ -960,18 +958,6 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
|
|||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
log_type= check_if_log_table(table_list->db_length, table_list->db,
|
|
||||||
table_list->table_name_length,
|
|
||||||
table_list->table_name, 1);
|
|
||||||
/* close log tables in use */
|
|
||||||
if (log_type)
|
|
||||||
{
|
|
||||||
lock_logger= 1;
|
|
||||||
logger.lock();
|
|
||||||
logger.close_log_table(log_type, FALSE);
|
|
||||||
closed_log_tables= closed_log_tables | log_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the .frm extension AIX 5.2 64-bit compiler bug (BUG#16155): this
|
// Remove the .frm extension AIX 5.2 64-bit compiler bug (BUG#16155): this
|
||||||
// crashes, replacement works. *(path + path_length - reg_ext_length)=
|
// crashes, replacement works. *(path + path_length - reg_ext_length)=
|
||||||
// '\0';
|
// '\0';
|
||||||
@ -997,14 +983,6 @@ end:
|
|||||||
VOID(pthread_mutex_lock(&LOCK_open));
|
VOID(pthread_mutex_lock(&LOCK_open));
|
||||||
unlock_table_name(thd, table_list);
|
unlock_table_name(thd, table_list);
|
||||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
VOID(pthread_mutex_unlock(&LOCK_open));
|
||||||
|
|
||||||
if (opt_slow_log && (closed_log_tables & QUERY_LOG_SLOW))
|
|
||||||
logger.reopen_log_table(QUERY_LOG_SLOW);
|
|
||||||
|
|
||||||
if (opt_log && (closed_log_tables & QUERY_LOG_GENERAL))
|
|
||||||
logger.reopen_log_table(QUERY_LOG_GENERAL);
|
|
||||||
if (lock_logger)
|
|
||||||
logger.unlock();
|
|
||||||
}
|
}
|
||||||
else if (error)
|
else if (error)
|
||||||
{
|
{
|
||||||
|
@ -137,6 +137,9 @@ MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level,
|
|||||||
level= MYSQL_ERROR::WARN_LEVEL_ERROR;
|
level= MYSQL_ERROR::WARN_LEVEL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (thd->handle_error(code, level))
|
||||||
|
DBUG_RETURN(NULL);
|
||||||
|
|
||||||
if (thd->spcont &&
|
if (thd->spcont &&
|
||||||
thd->spcont->handle_error(code, level, thd))
|
thd->spcont->handle_error(code, level, thd))
|
||||||
{
|
{
|
||||||
|
@ -2254,7 +2254,7 @@ pthread_handler_t handle_delayed_insert(void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* open table */
|
/* open table */
|
||||||
if (!(di->table=open_ltable(thd,&di->table_list,TL_WRITE_DELAYED)))
|
if (!(di->table=open_ltable(thd, &di->table_list, TL_WRITE_DELAYED, 0)))
|
||||||
{
|
{
|
||||||
thd->fatal_error(); // Abort waiting inserts
|
thd->fatal_error(); // Abort waiting inserts
|
||||||
goto err;
|
goto err;
|
||||||
|
133
sql/sql_lex.cc
133
sql/sql_lex.cc
@ -2367,12 +2367,129 @@ void st_select_lex_unit::set_limit(SELECT_LEX *sl)
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Update the parsed tree with information about triggers that
|
@brief Set the initial purpose of this TABLE_LIST object in the list of used
|
||||||
may be fired when executing this statement.
|
tables.
|
||||||
|
|
||||||
|
We need to track this information on table-by-table basis, since when this
|
||||||
|
table becomes an element of the pre-locked list, it's impossible to identify
|
||||||
|
which SQL sub-statement it has been originally used in.
|
||||||
|
|
||||||
|
E.g.:
|
||||||
|
|
||||||
|
User request: SELECT * FROM t1 WHERE f1();
|
||||||
|
FUNCTION f1(): DELETE FROM t2; RETURN 1;
|
||||||
|
BEFORE DELETE trigger on t2: INSERT INTO t3 VALUES (old.a);
|
||||||
|
|
||||||
|
For this user request, the pre-locked list will contain t1, t2, t3
|
||||||
|
table elements, each needed for different DML.
|
||||||
|
|
||||||
|
The trigger event map is updated to reflect INSERT, UPDATE, DELETE,
|
||||||
|
REPLACE, LOAD DATA, CREATE TABLE .. SELECT, CREATE TABLE ..
|
||||||
|
REPLACE SELECT statements, and additionally ON DUPLICATE KEY UPDATE
|
||||||
|
clause.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void st_lex::set_trg_event_type_for_tables()
|
void st_lex::set_trg_event_type_for_tables()
|
||||||
{
|
{
|
||||||
|
uint8 new_trg_event_map= 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Some auxiliary operations
|
||||||
|
(e.g. GRANT processing) create TABLE_LIST instances outside
|
||||||
|
the parser. Additionally, some commands (e.g. OPTIMIZE) change
|
||||||
|
the lock type for a table only after parsing is done. Luckily,
|
||||||
|
these do not fire triggers and do not need to pre-load them.
|
||||||
|
For these TABLE_LISTs set_trg_event_type is never called, and
|
||||||
|
trg_event_map is always empty. That means that the pre-locking
|
||||||
|
algorithm will ignore triggers defined on these tables, if
|
||||||
|
any, and the execution will either fail with an assert in
|
||||||
|
sql_trigger.cc or with an error that a used table was not
|
||||||
|
pre-locked, in case of a production build.
|
||||||
|
|
||||||
|
TODO: this usage pattern creates unnecessary module dependencies
|
||||||
|
and should be rewritten to go through the parser.
|
||||||
|
Table list instances created outside the parser in most cases
|
||||||
|
refer to mysql.* system tables. It is not allowed to have
|
||||||
|
a trigger on a system table, but keeping track of
|
||||||
|
initialization provides extra safety in case this limitation
|
||||||
|
is circumvented.
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch (sql_command) {
|
||||||
|
case SQLCOM_LOCK_TABLES:
|
||||||
|
/*
|
||||||
|
On a LOCK TABLE, all triggers must be pre-loaded for this TABLE_LIST
|
||||||
|
when opening an associated TABLE.
|
||||||
|
*/
|
||||||
|
new_trg_event_map= static_cast<uint8>
|
||||||
|
(1 << static_cast<int>(TRG_EVENT_INSERT)) |
|
||||||
|
static_cast<uint8>
|
||||||
|
(1 << static_cast<int>(TRG_EVENT_UPDATE)) |
|
||||||
|
static_cast<uint8>
|
||||||
|
(1 << static_cast<int>(TRG_EVENT_DELETE));
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
Basic INSERT. If there is an additional ON DUPLIATE KEY UPDATE
|
||||||
|
clause, it will be handled later in this method.
|
||||||
|
*/
|
||||||
|
case SQLCOM_INSERT: /* fall through */
|
||||||
|
case SQLCOM_INSERT_SELECT:
|
||||||
|
/*
|
||||||
|
LOAD DATA ... INFILE is expected to fire BEFORE/AFTER INSERT
|
||||||
|
triggers.
|
||||||
|
If the statement also has REPLACE clause, it will be
|
||||||
|
handled later in this method.
|
||||||
|
*/
|
||||||
|
case SQLCOM_LOAD: /* fall through */
|
||||||
|
/*
|
||||||
|
REPLACE is semantically equivalent to INSERT. In case
|
||||||
|
of a primary or unique key conflict, it deletes the old
|
||||||
|
record and inserts a new one. So we also may need to
|
||||||
|
fire ON DELETE triggers. This functionality is handled
|
||||||
|
later in this method.
|
||||||
|
*/
|
||||||
|
case SQLCOM_REPLACE: /* fall through */
|
||||||
|
case SQLCOM_REPLACE_SELECT:
|
||||||
|
/*
|
||||||
|
CREATE TABLE ... SELECT defaults to INSERT if the table or
|
||||||
|
view already exists. REPLACE option of CREATE TABLE ...
|
||||||
|
REPLACE SELECT is handled later in this method.
|
||||||
|
*/
|
||||||
|
case SQLCOM_CREATE_TABLE:
|
||||||
|
new_trg_event_map|= static_cast<uint8>
|
||||||
|
(1 << static_cast<int>(TRG_EVENT_INSERT));
|
||||||
|
break;
|
||||||
|
/* Basic update and multi-update */
|
||||||
|
case SQLCOM_UPDATE: /* fall through */
|
||||||
|
case SQLCOM_UPDATE_MULTI:
|
||||||
|
new_trg_event_map|= static_cast<uint8>
|
||||||
|
(1 << static_cast<int>(TRG_EVENT_UPDATE));
|
||||||
|
break;
|
||||||
|
/* Basic delete and multi-delete */
|
||||||
|
case SQLCOM_DELETE: /* fall through */
|
||||||
|
case SQLCOM_DELETE_MULTI:
|
||||||
|
new_trg_event_map|= static_cast<uint8>
|
||||||
|
(1 << static_cast<int>(TRG_EVENT_DELETE));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (duplicates) {
|
||||||
|
case DUP_UPDATE:
|
||||||
|
new_trg_event_map|= static_cast<uint8>
|
||||||
|
(1 << static_cast<int>(TRG_EVENT_UPDATE));
|
||||||
|
break;
|
||||||
|
case DUP_REPLACE:
|
||||||
|
new_trg_event_map|= static_cast<uint8>
|
||||||
|
(1 << static_cast<int>(TRG_EVENT_DELETE));
|
||||||
|
break;
|
||||||
|
case DUP_ERROR:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Do not iterate over sub-selects, only the tables in the outermost
|
Do not iterate over sub-selects, only the tables in the outermost
|
||||||
SELECT_LEX can be modified, if any.
|
SELECT_LEX can be modified, if any.
|
||||||
@ -2381,7 +2498,17 @@ void st_lex::set_trg_event_type_for_tables()
|
|||||||
|
|
||||||
while (tables)
|
while (tables)
|
||||||
{
|
{
|
||||||
tables->set_trg_event_type(this);
|
/*
|
||||||
|
This is a fast check to filter out statements that do
|
||||||
|
not change data, or tables on the right side, in case of
|
||||||
|
INSERT .. SELECT, CREATE TABLE .. SELECT and so on.
|
||||||
|
Here we also filter out OPTIMIZE statement and non-updateable
|
||||||
|
views, for which lock_type is TL_UNLOCK or TL_READ after
|
||||||
|
parsing.
|
||||||
|
*/
|
||||||
|
if (static_cast<int>(tables->lock_type) >=
|
||||||
|
static_cast<int>(TL_WRITE_ALLOW_WRITE))
|
||||||
|
tables->trg_event_map= new_trg_event_map;
|
||||||
tables= tables->next_local;
|
tables= tables->next_local;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,8 +197,8 @@ void init_update_queries(void)
|
|||||||
|
|
||||||
sql_command_flags[SQLCOM_CREATE_TABLE]= CF_CHANGES_DATA;
|
sql_command_flags[SQLCOM_CREATE_TABLE]= CF_CHANGES_DATA;
|
||||||
sql_command_flags[SQLCOM_CREATE_INDEX]= CF_CHANGES_DATA;
|
sql_command_flags[SQLCOM_CREATE_INDEX]= CF_CHANGES_DATA;
|
||||||
sql_command_flags[SQLCOM_ALTER_TABLE]= CF_CHANGES_DATA;
|
sql_command_flags[SQLCOM_ALTER_TABLE]= CF_CHANGES_DATA | CF_WRITE_LOGS_COMMAND;
|
||||||
sql_command_flags[SQLCOM_TRUNCATE]= CF_CHANGES_DATA;
|
sql_command_flags[SQLCOM_TRUNCATE]= CF_CHANGES_DATA | CF_WRITE_LOGS_COMMAND;
|
||||||
sql_command_flags[SQLCOM_DROP_TABLE]= CF_CHANGES_DATA;
|
sql_command_flags[SQLCOM_DROP_TABLE]= CF_CHANGES_DATA;
|
||||||
sql_command_flags[SQLCOM_LOAD]= CF_CHANGES_DATA;
|
sql_command_flags[SQLCOM_LOAD]= CF_CHANGES_DATA;
|
||||||
sql_command_flags[SQLCOM_CREATE_DB]= CF_CHANGES_DATA;
|
sql_command_flags[SQLCOM_CREATE_DB]= CF_CHANGES_DATA;
|
||||||
@ -211,7 +211,7 @@ void init_update_queries(void)
|
|||||||
sql_command_flags[SQLCOM_DROP_VIEW]= CF_CHANGES_DATA;
|
sql_command_flags[SQLCOM_DROP_VIEW]= CF_CHANGES_DATA;
|
||||||
sql_command_flags[SQLCOM_CREATE_EVENT]= CF_CHANGES_DATA;
|
sql_command_flags[SQLCOM_CREATE_EVENT]= CF_CHANGES_DATA;
|
||||||
sql_command_flags[SQLCOM_ALTER_EVENT]= CF_CHANGES_DATA;
|
sql_command_flags[SQLCOM_ALTER_EVENT]= CF_CHANGES_DATA;
|
||||||
sql_command_flags[SQLCOM_DROP_EVENT]= CF_CHANGES_DATA;
|
sql_command_flags[SQLCOM_DROP_EVENT]= CF_CHANGES_DATA;
|
||||||
|
|
||||||
sql_command_flags[SQLCOM_UPDATE]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
|
sql_command_flags[SQLCOM_UPDATE]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
|
||||||
sql_command_flags[SQLCOM_UPDATE_MULTI]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
|
sql_command_flags[SQLCOM_UPDATE_MULTI]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
|
||||||
@ -250,6 +250,14 @@ void init_update_queries(void)
|
|||||||
*/
|
*/
|
||||||
sql_command_flags[SQLCOM_CALL]= CF_HAS_ROW_COUNT;
|
sql_command_flags[SQLCOM_CALL]= CF_HAS_ROW_COUNT;
|
||||||
sql_command_flags[SQLCOM_EXECUTE]= CF_HAS_ROW_COUNT;
|
sql_command_flags[SQLCOM_EXECUTE]= CF_HAS_ROW_COUNT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
The following admin table operations are allowed
|
||||||
|
on log tables.
|
||||||
|
*/
|
||||||
|
sql_command_flags[SQLCOM_REPAIR]= CF_WRITE_LOGS_COMMAND;
|
||||||
|
sql_command_flags[SQLCOM_OPTIMIZE]= CF_WRITE_LOGS_COMMAND;
|
||||||
|
sql_command_flags[SQLCOM_ANALYZE]= CF_WRITE_LOGS_COMMAND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -259,6 +267,17 @@ bool is_update_query(enum enum_sql_command command)
|
|||||||
return (sql_command_flags[command] & CF_CHANGES_DATA) != 0;
|
return (sql_command_flags[command] & CF_CHANGES_DATA) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check if a sql command is allowed to write to log tables.
|
||||||
|
@param command The SQL command
|
||||||
|
@return true if writing is allowed
|
||||||
|
*/
|
||||||
|
bool is_log_table_write_query(enum enum_sql_command command)
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(command >= 0 && command <= SQLCOM_END);
|
||||||
|
return (sql_command_flags[command] & CF_WRITE_LOGS_COMMAND) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
void execute_init_command(THD *thd, sys_var_str *init_command_var,
|
void execute_init_command(THD *thd, sys_var_str *init_command_var,
|
||||||
rw_lock_t *var_mutex)
|
rw_lock_t *var_mutex)
|
||||||
{
|
{
|
||||||
@ -493,7 +512,7 @@ int mysql_table_dump(THD *thd, LEX_STRING *db, char *tbl_name)
|
|||||||
if (lower_case_table_names)
|
if (lower_case_table_names)
|
||||||
my_casedn_str(files_charset_info, tbl_name);
|
my_casedn_str(files_charset_info, tbl_name);
|
||||||
|
|
||||||
if (!(table=open_ltable(thd, table_list, TL_READ_NO_INSERT)))
|
if (!(table=open_ltable(thd, table_list, TL_READ_NO_INSERT, 0)))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
|
||||||
if (check_one_table_access(thd, SELECT_ACL, table_list))
|
if (check_one_table_access(thd, SELECT_ACL, table_list))
|
||||||
|
@ -1617,7 +1617,7 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl
|
|||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
|
|
||||||
/* need to open before acquiring LOCK_plugin or it will deadlock */
|
/* need to open before acquiring LOCK_plugin or it will deadlock */
|
||||||
if (! (table = open_ltable(thd, &tables, TL_WRITE)))
|
if (! (table = open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
|
|
||||||
pthread_mutex_lock(&LOCK_plugin);
|
pthread_mutex_lock(&LOCK_plugin);
|
||||||
@ -1674,7 +1674,7 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name)
|
|||||||
tables.table_name= tables.alias= (char *)"plugin";
|
tables.table_name= tables.alias= (char *)"plugin";
|
||||||
|
|
||||||
/* need to open before acquiring LOCK_plugin or it will deadlock */
|
/* need to open before acquiring LOCK_plugin or it will deadlock */
|
||||||
if (! (table= open_ltable(thd, &tables, TL_WRITE)))
|
if (! (table= open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
|
|
||||||
pthread_mutex_lock(&LOCK_plugin);
|
pthread_mutex_lock(&LOCK_plugin);
|
||||||
|
@ -37,7 +37,6 @@ bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent)
|
|||||||
TABLE_LIST *ren_table= 0;
|
TABLE_LIST *ren_table= 0;
|
||||||
int to_table;
|
int to_table;
|
||||||
char *rename_log_table[2]= {NULL, NULL};
|
char *rename_log_table[2]= {NULL, NULL};
|
||||||
int disable_logs= 0;
|
|
||||||
DBUG_ENTER("mysql_rename_tables");
|
DBUG_ENTER("mysql_rename_tables");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -79,12 +78,6 @@ bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent)
|
|||||||
ren_table->table_name_length,
|
ren_table->table_name_length,
|
||||||
ren_table->table_name, 1)))
|
ren_table->table_name, 1)))
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
Log table encoutered we will need to disable and lock logs
|
|
||||||
for duration of rename.
|
|
||||||
*/
|
|
||||||
disable_logs= TRUE;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
as we use log_table_rename as an array index, we need it to start
|
as we use log_table_rename as an array index, we need it to start
|
||||||
with 0, while QUERY_LOG_SLOW == 1 and QUERY_LOG_GENERAL == 2.
|
with 0, while QUERY_LOG_SLOW == 1 and QUERY_LOG_GENERAL == 2.
|
||||||
@ -136,12 +129,6 @@ bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent)
|
|||||||
rename_log_table[1]);
|
rename_log_table[1]);
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disable_logs)
|
|
||||||
{
|
|
||||||
logger.lock();
|
|
||||||
logger.tmp_close_log_tables(thd);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&LOCK_open);
|
pthread_mutex_lock(&LOCK_open);
|
||||||
@ -200,13 +187,6 @@ bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent)
|
|||||||
pthread_mutex_unlock(&LOCK_open);
|
pthread_mutex_unlock(&LOCK_open);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
/* enable logging back if needed */
|
|
||||||
if (disable_logs)
|
|
||||||
{
|
|
||||||
if (logger.reopen_log_tables())
|
|
||||||
error= TRUE;
|
|
||||||
logger.unlock();
|
|
||||||
}
|
|
||||||
start_waiting_global_read_lock(thd);
|
start_waiting_global_read_lock(thd);
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
@ -366,7 +366,7 @@ insert_server(THD *thd, FOREIGN_SERVER *server)
|
|||||||
tables.alias= tables.table_name= (char*) "servers";
|
tables.alias= tables.table_name= (char*) "servers";
|
||||||
|
|
||||||
/* need to open before acquiring THR_LOCK_plugin or it will deadlock */
|
/* need to open before acquiring THR_LOCK_plugin or it will deadlock */
|
||||||
if (! (table= open_ltable(thd, &tables, TL_WRITE)))
|
if (! (table= open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/* insert the server into the table */
|
/* insert the server into the table */
|
||||||
@ -588,7 +588,7 @@ int drop_server(THD *thd, LEX_SERVER_OPTIONS *server_options)
|
|||||||
if ((error= delete_server_record_in_cache(server_options)))
|
if ((error= delete_server_record_in_cache(server_options)))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
if (! (table= open_ltable(thd, &tables, TL_WRITE)))
|
if (! (table= open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||||
{
|
{
|
||||||
error= my_errno;
|
error= my_errno;
|
||||||
goto end;
|
goto end;
|
||||||
@ -705,7 +705,7 @@ int update_server(THD *thd, FOREIGN_SERVER *existing, FOREIGN_SERVER *altered)
|
|||||||
tables.db= (char*)"mysql";
|
tables.db= (char*)"mysql";
|
||||||
tables.alias= tables.table_name= (char*)"servers";
|
tables.alias= tables.table_name= (char*)"servers";
|
||||||
|
|
||||||
if (!(table= open_ltable(thd, &tables, TL_WRITE)))
|
if (!(table= open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||||
{
|
{
|
||||||
error= my_errno;
|
error= my_errno;
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -2176,9 +2176,6 @@ void calc_sum_of_all_status(STATUS_VAR *to)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* INFORMATION_SCHEMA name */
|
|
||||||
LEX_STRING INFORMATION_SCHEMA_NAME= { C_STRING_WITH_LEN("information_schema")};
|
|
||||||
|
|
||||||
/* This is only used internally, but we need it here as a forward reference */
|
/* This is only used internally, but we need it here as a forward reference */
|
||||||
extern ST_SCHEMA_TABLE schema_tables[];
|
extern ST_SCHEMA_TABLE schema_tables[];
|
||||||
|
|
||||||
|
@ -1513,7 +1513,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
|||||||
table->db_type= share->db_type();
|
table->db_type= share->db_type();
|
||||||
|
|
||||||
/* Disable drop of enabled log tables */
|
/* Disable drop of enabled log tables */
|
||||||
if (share && share->log_table &&
|
if (share && (share->table_category == TABLE_CATEGORY_PERFORMANCE) &&
|
||||||
check_if_log_table(table->db_length, table->db,
|
check_if_log_table(table->db_length, table->db,
|
||||||
table->table_name_length, table->table_name, 1))
|
table->table_name_length, table->table_name, 1))
|
||||||
{
|
{
|
||||||
@ -3966,7 +3966,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||||||
Item *item;
|
Item *item;
|
||||||
Protocol *protocol= thd->protocol;
|
Protocol *protocol= thd->protocol;
|
||||||
LEX *lex= thd->lex;
|
LEX *lex= thd->lex;
|
||||||
int result_code, disable_logs= 0;
|
int result_code;
|
||||||
DBUG_ENTER("mysql_admin_table");
|
DBUG_ENTER("mysql_admin_table");
|
||||||
|
|
||||||
if (end_active_trans(thd))
|
if (end_active_trans(thd))
|
||||||
@ -4014,22 +4014,6 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||||||
if (view_operator_func == NULL)
|
if (view_operator_func == NULL)
|
||||||
table->required_type=FRMTYPE_TABLE;
|
table->required_type=FRMTYPE_TABLE;
|
||||||
|
|
||||||
/*
|
|
||||||
If we want to perform an admin operation on the log table
|
|
||||||
(E.g. rename) and lock_type >= TL_READ_NO_INSERT disable
|
|
||||||
log tables
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (check_if_log_table(table->db_length, table->db,
|
|
||||||
table->table_name_length,
|
|
||||||
table->table_name, 1) &&
|
|
||||||
lock_type >= TL_READ_NO_INSERT)
|
|
||||||
{
|
|
||||||
disable_logs= 1;
|
|
||||||
logger.lock();
|
|
||||||
logger.tmp_close_log_tables(thd);
|
|
||||||
}
|
|
||||||
|
|
||||||
open_and_lock_tables(thd, table);
|
open_and_lock_tables(thd, table);
|
||||||
thd->no_warnings_for_error= 0;
|
thd->no_warnings_for_error= 0;
|
||||||
table->next_global= save_next_global;
|
table->next_global= save_next_global;
|
||||||
@ -4099,8 +4083,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Close all instances of the table to allow repair to rename files */
|
/* Close all instances of the table to allow repair to rename files */
|
||||||
if (lock_type == TL_WRITE && table->table->s->version &&
|
if (lock_type == TL_WRITE && table->table->s->version)
|
||||||
!table->table->s->log_table)
|
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&LOCK_open);
|
pthread_mutex_lock(&LOCK_open);
|
||||||
const char *old_message=thd->enter_cond(&COND_refresh, &LOCK_open,
|
const char *old_message=thd->enter_cond(&COND_refresh, &LOCK_open,
|
||||||
@ -4258,7 +4241,7 @@ send_result_message:
|
|||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
if (!result_code) // recreation went ok
|
if (!result_code) // recreation went ok
|
||||||
{
|
{
|
||||||
if ((table->table= open_ltable(thd, table, lock_type)) &&
|
if ((table->table= open_ltable(thd, table, lock_type, 0)) &&
|
||||||
((result_code= table->table->file->analyze(thd, check_opt)) > 0))
|
((result_code= table->table->file->analyze(thd, check_opt)) > 0))
|
||||||
result_code= 0; // analyze went ok
|
result_code= 0; // analyze went ok
|
||||||
}
|
}
|
||||||
@ -4324,10 +4307,9 @@ send_result_message:
|
|||||||
}
|
}
|
||||||
if (table->table)
|
if (table->table)
|
||||||
{
|
{
|
||||||
/* in the below check we do not refresh the log tables */
|
|
||||||
if (fatal_error)
|
if (fatal_error)
|
||||||
table->table->s->version=0; // Force close of table
|
table->table->s->version=0; // Force close of table
|
||||||
else if (open_for_modify && !table->table->s->log_table)
|
else if (open_for_modify)
|
||||||
{
|
{
|
||||||
if (table->table->s->tmp_table)
|
if (table->table->s->tmp_table)
|
||||||
table->table->file->info(HA_STATUS_CONST);
|
table->table->file->info(HA_STATUS_CONST);
|
||||||
@ -4350,24 +4332,11 @@ send_result_message:
|
|||||||
}
|
}
|
||||||
|
|
||||||
send_eof(thd);
|
send_eof(thd);
|
||||||
if (disable_logs)
|
|
||||||
{
|
|
||||||
if (logger.reopen_log_tables())
|
|
||||||
my_error(ER_CANT_ACTIVATE_LOG, MYF(0));
|
|
||||||
logger.unlock();
|
|
||||||
}
|
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
ha_autocommit_or_rollback(thd, 1);
|
ha_autocommit_or_rollback(thd, 1);
|
||||||
close_thread_tables(thd); // Shouldn't be needed
|
close_thread_tables(thd); // Shouldn't be needed
|
||||||
/* enable logging back if needed */
|
|
||||||
if (disable_logs)
|
|
||||||
{
|
|
||||||
if (logger.reopen_log_tables())
|
|
||||||
my_error(ER_CANT_ACTIVATE_LOG, MYF(0));
|
|
||||||
logger.unlock();
|
|
||||||
}
|
|
||||||
if (table)
|
if (table)
|
||||||
table->table=0;
|
table->table=0;
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
@ -4812,7 +4781,7 @@ mysql_discard_or_import_tablespace(THD *thd,
|
|||||||
not complain when we lock the table
|
not complain when we lock the table
|
||||||
*/
|
*/
|
||||||
thd->tablespace_op= TRUE;
|
thd->tablespace_op= TRUE;
|
||||||
if (!(table=open_ltable(thd,table_list,TL_WRITE)))
|
if (!(table=open_ltable(thd, table_list, TL_WRITE, 0)))
|
||||||
{
|
{
|
||||||
thd->tablespace_op=FALSE;
|
thd->tablespace_op=FALSE;
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
@ -5728,7 +5697,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||||
if (alter_info->flags & ALTER_PARTITION)
|
if (alter_info->flags & ALTER_PARTITION)
|
||||||
{
|
{
|
||||||
my_error(ER_WRONG_USAGE, MYF(0), "PARTITION", "log table");
|
my_error(ER_WRONG_USAGE, MYF(0), "PARTITION", "log table");
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -5817,7 +5786,7 @@ view_err:
|
|||||||
start_waiting_global_read_lock(thd);
|
start_waiting_global_read_lock(thd);
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
if (!(table=open_ltable(thd,table_list,TL_WRITE_ALLOW_READ)))
|
if (!(table=open_ltable(thd, table_list, TL_WRITE_ALLOW_READ, 0)))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
table->use_all_columns();
|
table->use_all_columns();
|
||||||
|
|
||||||
@ -6984,7 +6953,7 @@ bool mysql_checksum_table(THD *thd, TABLE_LIST *tables,
|
|||||||
|
|
||||||
strxmov(table_name, table->db ,".", table->table_name, NullS);
|
strxmov(table_name, table->db ,".", table->table_name, NullS);
|
||||||
|
|
||||||
t= table->table= open_ltable(thd, table, TL_READ);
|
t= table->table= open_ltable(thd, table, TL_READ, 0);
|
||||||
thd->clear_error(); // these errors shouldn't get client
|
thd->clear_error(); // these errors shouldn't get client
|
||||||
|
|
||||||
protocol->prepare_for_resend();
|
protocol->prepare_for_resend();
|
||||||
|
@ -472,7 +472,7 @@ int mysql_create_function(THD *thd,udf_func *udf)
|
|||||||
tables.db= (char*) "mysql";
|
tables.db= (char*) "mysql";
|
||||||
tables.table_name= tables.alias= (char*) "func";
|
tables.table_name= tables.alias= (char*) "func";
|
||||||
/* Allow creation of functions even if we can't open func table */
|
/* Allow creation of functions even if we can't open func table */
|
||||||
if (!(table = open_ltable(thd,&tables,TL_WRITE)))
|
if (!(table = open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||||
goto err;
|
goto err;
|
||||||
table->use_all_columns();
|
table->use_all_columns();
|
||||||
restore_record(table, s->default_values); // Default values for fields
|
restore_record(table, s->default_values); // Default values for fields
|
||||||
@ -547,7 +547,7 @@ int mysql_drop_function(THD *thd,const LEX_STRING *udf_name)
|
|||||||
bzero((char*) &tables,sizeof(tables));
|
bzero((char*) &tables,sizeof(tables));
|
||||||
tables.db=(char*) "mysql";
|
tables.db=(char*) "mysql";
|
||||||
tables.table_name= tables.alias= (char*) "func";
|
tables.table_name= tables.alias= (char*) "func";
|
||||||
if (!(table = open_ltable(thd,&tables,TL_WRITE)))
|
if (!(table = open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||||
goto err;
|
goto err;
|
||||||
table->use_all_columns();
|
table->use_all_columns();
|
||||||
table->field[0]->store(exact_name_str, exact_name_len, &my_charset_bin);
|
table->field[0]->store(exact_name_str, exact_name_len, &my_charset_bin);
|
||||||
|
@ -7277,7 +7277,7 @@ join_table:
|
|||||||
so that [INNER | CROSS] JOIN is properly nested as other
|
so that [INNER | CROSS] JOIN is properly nested as other
|
||||||
left-associative joins.
|
left-associative joins.
|
||||||
*/
|
*/
|
||||||
table_ref %prec TABLE_REF_PRIORITY normal_join table_ref
|
table_ref normal_join table_ref %prec TABLE_REF_PRIORITY
|
||||||
{ MYSQL_YYABORT_UNLESS($1 && ($$=$3)); }
|
{ MYSQL_YYABORT_UNLESS($1 && ($$=$3)); }
|
||||||
| table_ref STRAIGHT_JOIN table_factor
|
| table_ref STRAIGHT_JOIN table_factor
|
||||||
{ MYSQL_YYABORT_UNLESS($1 && ($$=$3)); $3->straight=1; }
|
{ MYSQL_YYABORT_UNLESS($1 && ($$=$3)); $3->straight=1; }
|
||||||
|
209
sql/table.cc
209
sql/table.cc
@ -21,6 +21,18 @@
|
|||||||
#include <m_ctype.h>
|
#include <m_ctype.h>
|
||||||
#include "my_md5.h"
|
#include "my_md5.h"
|
||||||
|
|
||||||
|
/* INFORMATION_SCHEMA name */
|
||||||
|
LEX_STRING INFORMATION_SCHEMA_NAME= {C_STRING_WITH_LEN("information_schema")};
|
||||||
|
|
||||||
|
/* MYSQL_SCHEMA name */
|
||||||
|
LEX_STRING MYSQL_SCHEMA_NAME= {C_STRING_WITH_LEN("mysql")};
|
||||||
|
|
||||||
|
/* GENERAL_LOG name */
|
||||||
|
LEX_STRING GENERAL_LOG_NAME= {C_STRING_WITH_LEN("general_log")};
|
||||||
|
|
||||||
|
/* SLOW_LOG name */
|
||||||
|
LEX_STRING SLOW_LOG_NAME= {C_STRING_WITH_LEN("slow_log")};
|
||||||
|
|
||||||
/* Functions defined in this file */
|
/* Functions defined in this file */
|
||||||
|
|
||||||
void open_table_error(TABLE_SHARE *share, int error, int db_errno,
|
void open_table_error(TABLE_SHARE *share, int error, int db_errno,
|
||||||
@ -31,6 +43,7 @@ static void fix_type_pointers(const char ***array, TYPELIB *point_to_type,
|
|||||||
uint types, char **names);
|
uint types, char **names);
|
||||||
static uint find_field(Field **fields, uchar *record, uint start, uint length);
|
static uint find_field(Field **fields, uchar *record, uint start, uint length);
|
||||||
|
|
||||||
|
inline bool is_system_table_name(const char *name, uint length);
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
Object_creation_ctx implementation.
|
Object_creation_ctx implementation.
|
||||||
@ -192,6 +205,49 @@ char *fn_rext(char *name)
|
|||||||
return name + strlen(name);
|
return name + strlen(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TABLE_CATEGORY get_table_category(const LEX_STRING *db, const LEX_STRING *name)
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(db != NULL);
|
||||||
|
DBUG_ASSERT(name != NULL);
|
||||||
|
|
||||||
|
if ((db->length == INFORMATION_SCHEMA_NAME.length) &&
|
||||||
|
(my_strcasecmp(system_charset_info,
|
||||||
|
INFORMATION_SCHEMA_NAME.str,
|
||||||
|
db->str) == 0))
|
||||||
|
{
|
||||||
|
return TABLE_CATEGORY_INFORMATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((db->length == MYSQL_SCHEMA_NAME.length) &&
|
||||||
|
(my_strcasecmp(system_charset_info,
|
||||||
|
MYSQL_SCHEMA_NAME.str,
|
||||||
|
db->str) == 0))
|
||||||
|
{
|
||||||
|
if (is_system_table_name(name->str, name->length))
|
||||||
|
{
|
||||||
|
return TABLE_CATEGORY_SYSTEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((name->length == GENERAL_LOG_NAME.length) &&
|
||||||
|
(my_strcasecmp(system_charset_info,
|
||||||
|
GENERAL_LOG_NAME.str,
|
||||||
|
name->str) == 0))
|
||||||
|
{
|
||||||
|
return TABLE_CATEGORY_PERFORMANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((name->length == SLOW_LOG_NAME.length) &&
|
||||||
|
(my_strcasecmp(system_charset_info,
|
||||||
|
SLOW_LOG_NAME.str,
|
||||||
|
name->str) == 0))
|
||||||
|
{
|
||||||
|
return TABLE_CATEGORY_PERFORMANCE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TABLE_CATEGORY_USER;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Allocate a setup TABLE_SHARE structure
|
Allocate a setup TABLE_SHARE structure
|
||||||
@ -297,7 +353,8 @@ void init_tmp_table_share(TABLE_SHARE *share, const char *key,
|
|||||||
|
|
||||||
bzero((char*) share, sizeof(*share));
|
bzero((char*) share, sizeof(*share));
|
||||||
init_sql_alloc(&share->mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
|
init_sql_alloc(&share->mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
|
||||||
share->tmp_table= INTERNAL_TMP_TABLE;
|
share->table_category= TABLE_CATEGORY_TEMPORARY;
|
||||||
|
share->tmp_table= INTERNAL_TMP_TABLE;
|
||||||
share->db.str= (char*) key;
|
share->db.str= (char*) key;
|
||||||
share->db.length= strlen(key);
|
share->db.length= strlen(key);
|
||||||
share->table_cache_key.str= (char*) key;
|
share->table_cache_key.str= (char*) key;
|
||||||
@ -544,28 +601,11 @@ int open_table_def(THD *thd, TABLE_SHARE *share, uint db_flags)
|
|||||||
*root_ptr= &share->mem_root;
|
*root_ptr= &share->mem_root;
|
||||||
error= open_binary_frm(thd, share, head, file);
|
error= open_binary_frm(thd, share, head, file);
|
||||||
*root_ptr= old_root;
|
*root_ptr= old_root;
|
||||||
|
|
||||||
if (share->db.length == 5 && !(lower_case_table_names ?
|
|
||||||
my_strcasecmp(system_charset_info, share->db.str, "mysql") :
|
|
||||||
strcmp(share->db.str, "mysql")))
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
We can't mark all tables in 'mysql' database as system since we don't
|
|
||||||
allow to lock such tables for writing with any other tables (even with
|
|
||||||
other system tables) and some privilege tables need this.
|
|
||||||
*/
|
|
||||||
share->system_table= is_system_table_name(share->table_name.str,
|
|
||||||
share->table_name.length);
|
|
||||||
if (!share->system_table)
|
|
||||||
{
|
|
||||||
share->log_table= check_if_log_table(share->db.length, share->db.str,
|
|
||||||
share->table_name.length,
|
|
||||||
share->table_name.str, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
error_given= 1;
|
error_given= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
share->table_category= get_table_category(& share->db, & share->table_name);
|
||||||
|
|
||||||
if (!error)
|
if (!error)
|
||||||
thd->status_var.opened_shares++;
|
thd->status_var.opened_shares++;
|
||||||
|
|
||||||
@ -2854,135 +2894,6 @@ void st_table::reset_item_list(List<Item> *item_list) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Set the initial purpose of this TABLE_LIST object in the list of
|
|
||||||
used tables. We need to track this information on table-by-
|
|
||||||
table basis, since when this table becomes an element of the
|
|
||||||
pre-locked list, it's impossible to identify which SQL
|
|
||||||
sub-statement it has been originally used in.
|
|
||||||
|
|
||||||
E.g.:
|
|
||||||
|
|
||||||
User request: SELECT * FROM t1 WHERE f1();
|
|
||||||
FUNCTION f1(): DELETE FROM t2; RETURN 1;
|
|
||||||
BEFORE DELETE trigger on t2: INSERT INTO t3 VALUES (old.a);
|
|
||||||
|
|
||||||
For this user request, the pre-locked list will contain t1, t2, t3
|
|
||||||
table elements, each needed for different DML.
|
|
||||||
|
|
||||||
This method is called immediately after parsing for tables
|
|
||||||
of the table list of the top-level select lex.
|
|
||||||
|
|
||||||
The trigger event map is updated to reflect INSERT, UPDATE, DELETE,
|
|
||||||
REPLACE, LOAD DATA, CREATE TABLE .. SELECT, CREATE TABLE ..
|
|
||||||
REPLACE SELECT statements, and additionally ON DUPLICATE KEY UPDATE
|
|
||||||
clause.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
TABLE_LIST::set_trg_event_type(const st_lex *lex)
|
|
||||||
{
|
|
||||||
enum trg_event_type trg_event;
|
|
||||||
|
|
||||||
/*
|
|
||||||
Some auxiliary operations
|
|
||||||
(e.g. GRANT processing) create TABLE_LIST instances outside
|
|
||||||
the parser. Additionally, some commands (e.g. OPTIMIZE) change
|
|
||||||
the lock type for a table only after parsing is done. Luckily,
|
|
||||||
these do not fire triggers and do not need to pre-load them.
|
|
||||||
For these TABLE_LISTs set_trg_event_type is never called, and
|
|
||||||
trg_event_map is always empty. That means that the pre-locking
|
|
||||||
algorithm will ignore triggers defined on these tables, if
|
|
||||||
any, and the execution will either fail with an assert in
|
|
||||||
sql_trigger.cc or with an error that a used table was not
|
|
||||||
pre-locked, in case of a production build.
|
|
||||||
|
|
||||||
TODO: this usage pattern creates unnecessary module dependencies
|
|
||||||
and should be rewritten to go through the parser.
|
|
||||||
Table list instances created outside the parser in most cases
|
|
||||||
refer to mysql.* system tables. It is not allowed to have
|
|
||||||
a trigger on a system table, but keeping track of
|
|
||||||
initialization provides extra safety in case this limitation
|
|
||||||
is circumvented.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This is a fast check to filter out statements that do
|
|
||||||
not change data, or tables on the right side, in case of
|
|
||||||
INSERT .. SELECT, CREATE TABLE .. SELECT and so on.
|
|
||||||
Here we also filter out OPTIMIZE statement and non-updateable
|
|
||||||
views, for which lock_type is TL_UNLOCK or TL_READ after
|
|
||||||
parsing.
|
|
||||||
*/
|
|
||||||
if (static_cast<int>(lock_type) < static_cast<int>(TL_WRITE_ALLOW_WRITE))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (lex->sql_command) {
|
|
||||||
/*
|
|
||||||
Basic INSERT. If there is an additional ON DUPLIATE KEY UPDATE
|
|
||||||
clause, it will be handled later in this method.
|
|
||||||
*/
|
|
||||||
case SQLCOM_INSERT: /* fall through */
|
|
||||||
case SQLCOM_INSERT_SELECT:
|
|
||||||
/*
|
|
||||||
LOAD DATA ... INFILE is expected to fire BEFORE/AFTER INSERT
|
|
||||||
triggers.
|
|
||||||
If the statement also has REPLACE clause, it will be
|
|
||||||
handled later in this method.
|
|
||||||
*/
|
|
||||||
case SQLCOM_LOAD: /* fall through */
|
|
||||||
/*
|
|
||||||
REPLACE is semantically equivalent to INSERT. In case
|
|
||||||
of a primary or unique key conflict, it deletes the old
|
|
||||||
record and inserts a new one. So we also may need to
|
|
||||||
fire ON DELETE triggers. This functionality is handled
|
|
||||||
later in this method.
|
|
||||||
*/
|
|
||||||
case SQLCOM_REPLACE: /* fall through */
|
|
||||||
case SQLCOM_REPLACE_SELECT:
|
|
||||||
/*
|
|
||||||
CREATE TABLE ... SELECT defaults to INSERT if the table or
|
|
||||||
view already exists. REPLACE option of CREATE TABLE ...
|
|
||||||
REPLACE SELECT is handled later in this method.
|
|
||||||
*/
|
|
||||||
case SQLCOM_CREATE_TABLE:
|
|
||||||
trg_event= TRG_EVENT_INSERT;
|
|
||||||
break;
|
|
||||||
/* Basic update and multi-update */
|
|
||||||
case SQLCOM_UPDATE: /* fall through */
|
|
||||||
case SQLCOM_UPDATE_MULTI:
|
|
||||||
trg_event= TRG_EVENT_UPDATE;
|
|
||||||
break;
|
|
||||||
/* Basic delete and multi-delete */
|
|
||||||
case SQLCOM_DELETE: /* fall through */
|
|
||||||
case SQLCOM_DELETE_MULTI:
|
|
||||||
trg_event= TRG_EVENT_DELETE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/*
|
|
||||||
OK to return, since value of 'duplicates' is irrelevant
|
|
||||||
for non-updating commands.
|
|
||||||
*/
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
trg_event_map|= static_cast<uint8>(1 << static_cast<int>(trg_event));
|
|
||||||
|
|
||||||
switch (lex->duplicates) {
|
|
||||||
case DUP_UPDATE:
|
|
||||||
trg_event= TRG_EVENT_UPDATE;
|
|
||||||
break;
|
|
||||||
case DUP_REPLACE:
|
|
||||||
trg_event= TRG_EVENT_DELETE;
|
|
||||||
break;
|
|
||||||
case DUP_ERROR:
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
trg_event_map|= static_cast<uint8>(1 << static_cast<int>(trg_event));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
calculate md5 of query
|
calculate md5 of query
|
||||||
|
|
||||||
|
121
sql/table.h
121
sql/table.h
@ -140,6 +140,100 @@ class Field_timestamp;
|
|||||||
class Field_blob;
|
class Field_blob;
|
||||||
class Table_triggers_list;
|
class Table_triggers_list;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Category of table found in the table share.
|
||||||
|
*/
|
||||||
|
enum enum_table_category
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
Unknown value.
|
||||||
|
*/
|
||||||
|
TABLE_UNKNOWN_CATEGORY=0,
|
||||||
|
|
||||||
|
/**
|
||||||
|
Temporary table.
|
||||||
|
The table is visible only in the session.
|
||||||
|
Therefore,
|
||||||
|
- FLUSH TABLES WITH READ LOCK
|
||||||
|
- SET GLOBAL READ_ONLY = ON
|
||||||
|
do not apply to this table.
|
||||||
|
Note that LOCK TABLE <t> FOR READ/WRITE
|
||||||
|
can be used on temporary tables.
|
||||||
|
Temporary tables are not part of the table cache.
|
||||||
|
*/
|
||||||
|
TABLE_CATEGORY_TEMPORARY=1,
|
||||||
|
|
||||||
|
/**
|
||||||
|
User table.
|
||||||
|
These tables do honor:
|
||||||
|
- LOCK TABLE <t> FOR READ/WRITE
|
||||||
|
- FLUSH TABLES WITH READ LOCK
|
||||||
|
- SET GLOBAL READ_ONLY = ON
|
||||||
|
User tables are cached in the table cache.
|
||||||
|
*/
|
||||||
|
TABLE_CATEGORY_USER=2,
|
||||||
|
|
||||||
|
/**
|
||||||
|
System table, maintained by the server.
|
||||||
|
These tables do honor:
|
||||||
|
- LOCK TABLE <t> FOR READ/WRITE
|
||||||
|
- FLUSH TABLES WITH READ LOCK
|
||||||
|
- SET GLOBAL READ_ONLY = ON
|
||||||
|
Typically, writes to system tables are performed by
|
||||||
|
the server implementation, not explicitly be a user.
|
||||||
|
System tables are cached in the table cache.
|
||||||
|
*/
|
||||||
|
TABLE_CATEGORY_SYSTEM=3,
|
||||||
|
|
||||||
|
/**
|
||||||
|
Information schema tables.
|
||||||
|
These tables are an interface provided by the system
|
||||||
|
to inspect the system metadata.
|
||||||
|
These tables do *not* honor:
|
||||||
|
- LOCK TABLE <t> FOR READ/WRITE
|
||||||
|
- FLUSH TABLES WITH READ LOCK
|
||||||
|
- SET GLOBAL READ_ONLY = ON
|
||||||
|
as there is no point in locking explicitely
|
||||||
|
an INFORMATION_SCHEMA table.
|
||||||
|
Nothing is directly written to information schema tables.
|
||||||
|
Note that this value is not used currently,
|
||||||
|
since information schema tables are not shared,
|
||||||
|
but implemented as session specific temporary tables.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
TODO: Fixing the performance issues of I_S will lead
|
||||||
|
to I_S tables in the table cache, which should use
|
||||||
|
this table type.
|
||||||
|
*/
|
||||||
|
TABLE_CATEGORY_INFORMATION=4,
|
||||||
|
|
||||||
|
/**
|
||||||
|
Performance schema tables.
|
||||||
|
These tables are an interface provided by the system
|
||||||
|
to inspect the system performance data.
|
||||||
|
These tables do *not* honor:
|
||||||
|
- LOCK TABLE <t> FOR READ/WRITE
|
||||||
|
- FLUSH TABLES WITH READ LOCK
|
||||||
|
- SET GLOBAL READ_ONLY = ON
|
||||||
|
as there is no point in locking explicitely
|
||||||
|
a PERFORMANCE_SCHEMA table.
|
||||||
|
An example of PERFORMANCE_SCHEMA tables are:
|
||||||
|
- mysql.slow_log
|
||||||
|
- mysql.general_log,
|
||||||
|
which *are* updated even when there is either
|
||||||
|
a GLOBAL READ LOCK or a GLOBAL READ_ONLY in effect.
|
||||||
|
User queries do not write directly to these tables
|
||||||
|
(there are exceptions for log tables).
|
||||||
|
The server implementation perform writes.
|
||||||
|
Performance tables are cached in the table cache.
|
||||||
|
*/
|
||||||
|
TABLE_CATEGORY_PERFORMANCE=5
|
||||||
|
};
|
||||||
|
typedef enum enum_table_category TABLE_CATEGORY;
|
||||||
|
|
||||||
|
TABLE_CATEGORY get_table_category(const LEX_STRING *db,
|
||||||
|
const LEX_STRING *name);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This structure is shared between different table objects. There is one
|
This structure is shared between different table objects. There is one
|
||||||
instance of table share per one table in the database.
|
instance of table share per one table in the database.
|
||||||
@ -148,6 +242,10 @@ class Table_triggers_list;
|
|||||||
typedef struct st_table_share
|
typedef struct st_table_share
|
||||||
{
|
{
|
||||||
st_table_share() {} /* Remove gcc warning */
|
st_table_share() {} /* Remove gcc warning */
|
||||||
|
|
||||||
|
/** Category of this table. */
|
||||||
|
TABLE_CATEGORY table_category;
|
||||||
|
|
||||||
/* hash of field names (contains pointers to elements of field array) */
|
/* hash of field names (contains pointers to elements of field array) */
|
||||||
HASH name_hash; /* hash of field names */
|
HASH name_hash; /* hash of field names */
|
||||||
MEM_ROOT mem_root;
|
MEM_ROOT mem_root;
|
||||||
@ -259,18 +357,6 @@ typedef struct st_table_share
|
|||||||
*/
|
*/
|
||||||
int cached_row_logging_check;
|
int cached_row_logging_check;
|
||||||
|
|
||||||
/*
|
|
||||||
TRUE if this is a system table like 'mysql.proc', which we want to be
|
|
||||||
able to open and lock even when we already have some tables open and
|
|
||||||
locked. To avoid deadlocks we have to put certain restrictions on
|
|
||||||
locking of this table for writing. FALSE - otherwise.
|
|
||||||
*/
|
|
||||||
bool system_table;
|
|
||||||
/*
|
|
||||||
This flag is set for the log tables. Used during FLUSH instances to skip
|
|
||||||
log tables, while closing tables (since logs must be always available)
|
|
||||||
*/
|
|
||||||
bool log_table;
|
|
||||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||||
bool auto_partitioned;
|
bool auto_partitioned;
|
||||||
const char *partition_info;
|
const char *partition_info;
|
||||||
@ -334,6 +420,16 @@ typedef struct st_table_share
|
|||||||
set_table_cache_key(key_buff, key_length);
|
set_table_cache_key(key_buff, key_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool honor_global_locks()
|
||||||
|
{
|
||||||
|
return ((table_category == TABLE_CATEGORY_USER)
|
||||||
|
|| (table_category == TABLE_CATEGORY_SYSTEM));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool require_write_privileges()
|
||||||
|
{
|
||||||
|
return (table_category == TABLE_CATEGORY_PERFORMANCE);
|
||||||
|
}
|
||||||
} TABLE_SHARE;
|
} TABLE_SHARE;
|
||||||
|
|
||||||
|
|
||||||
@ -1052,7 +1148,6 @@ struct TABLE_LIST
|
|||||||
*/
|
*/
|
||||||
bool process_index_hints(TABLE *table);
|
bool process_index_hints(TABLE *table);
|
||||||
|
|
||||||
void set_trg_event_type(const st_lex *lex);
|
|
||||||
private:
|
private:
|
||||||
bool prep_check_option(THD *thd, uint8 check_opt_type);
|
bool prep_check_option(THD *thd, uint8 check_opt_type);
|
||||||
bool prep_where(THD *thd, Item **conds, bool no_where_clause);
|
bool prep_where(THD *thd, Item **conds, bool no_where_clause);
|
||||||
|
@ -807,19 +807,6 @@ sec_since_epoch(int year, int mon, int mday, int hour, int min ,int sec)
|
|||||||
SECS_PER_MIN + sec;
|
SECS_PER_MIN + sec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Works like sec_since_epoch but expects MYSQL_TIME structure as parameter.
|
|
||||||
*/
|
|
||||||
|
|
||||||
my_time_t
|
|
||||||
sec_since_epoch_TIME(MYSQL_TIME *t)
|
|
||||||
{
|
|
||||||
return sec_since_epoch(t->year, t->month, t->day,
|
|
||||||
t->hour, t->minute, t->second);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Converts local time in broken down MYSQL_TIME representation to my_time_t
|
Converts local time in broken down MYSQL_TIME representation to my_time_t
|
||||||
representation.
|
representation.
|
||||||
@ -1425,7 +1412,9 @@ Time_zone_offset::get_name() const
|
|||||||
|
|
||||||
static Time_zone_utc tz_UTC;
|
static Time_zone_utc tz_UTC;
|
||||||
static Time_zone_system tz_SYSTEM;
|
static Time_zone_system tz_SYSTEM;
|
||||||
|
static Time_zone_offset tz_OFFSET0(0);
|
||||||
|
|
||||||
|
Time_zone *my_tz_OFFSET0= &tz_OFFSET0;
|
||||||
Time_zone *my_tz_UTC= &tz_UTC;
|
Time_zone *my_tz_UTC= &tz_UTC;
|
||||||
Time_zone *my_tz_SYSTEM= &tz_SYSTEM;
|
Time_zone *my_tz_SYSTEM= &tz_SYSTEM;
|
||||||
|
|
||||||
|
@ -59,6 +59,7 @@ public:
|
|||||||
|
|
||||||
extern Time_zone * my_tz_UTC;
|
extern Time_zone * my_tz_UTC;
|
||||||
extern Time_zone * my_tz_SYSTEM;
|
extern Time_zone * my_tz_SYSTEM;
|
||||||
|
extern Time_zone * my_tz_OFFSET0;
|
||||||
extern Time_zone * my_tz_find(THD *thd, const String *name);
|
extern Time_zone * my_tz_find(THD *thd, const String *name);
|
||||||
extern my_bool my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap);
|
extern my_bool my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap);
|
||||||
extern void my_tz_free();
|
extern void my_tz_free();
|
||||||
|
@ -786,18 +786,6 @@ void ha_tina::update_status()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool ha_tina::check_if_locking_is_allowed(uint sql_command,
|
|
||||||
ulong type, TABLE *table,
|
|
||||||
uint count, uint current,
|
|
||||||
uint *system_count,
|
|
||||||
bool called_by_privileged_thread)
|
|
||||||
{
|
|
||||||
if (!called_by_privileged_thread)
|
|
||||||
return check_if_log_table_locking_is_allowed(sql_command, type, table);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Open a database file. Keep in mind that tables are caches, so
|
Open a database file. Keep in mind that tables are caches, so
|
||||||
this will not be called for every request. Any sort of positions
|
this will not be called for every request. Any sort of positions
|
||||||
|
@ -131,11 +131,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
ha_rows estimate_rows_upper_bound() { return HA_POS_ERROR; }
|
ha_rows estimate_rows_upper_bound() { return HA_POS_ERROR; }
|
||||||
|
|
||||||
virtual bool check_if_locking_is_allowed(uint sql_command,
|
|
||||||
ulong type, TABLE *table,
|
|
||||||
uint count, uint current,
|
|
||||||
uint *system_count,
|
|
||||||
bool called_by_logger_thread);
|
|
||||||
int open(const char *name, int mode, uint open_options);
|
int open(const char *name, int mode, uint open_options);
|
||||||
int close(void);
|
int close(void);
|
||||||
int write_row(uchar * buf);
|
int write_row(uchar * buf);
|
||||||
|
@ -607,41 +607,7 @@ err:
|
|||||||
#endif /* HAVE_REPLICATION */
|
#endif /* HAVE_REPLICATION */
|
||||||
|
|
||||||
|
|
||||||
bool ha_myisam::check_if_locking_is_allowed(uint sql_command,
|
/* Name is here without an extension */
|
||||||
ulong type, TABLE *table,
|
|
||||||
uint count, uint current,
|
|
||||||
uint *system_count,
|
|
||||||
bool called_by_privileged_thread)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
To be able to open and lock for reading system tables like 'mysql.proc',
|
|
||||||
when we already have some tables opened and locked, and avoid deadlocks
|
|
||||||
we have to disallow write-locking of these tables with any other tables.
|
|
||||||
*/
|
|
||||||
if (table->s->system_table &&
|
|
||||||
table->reginfo.lock_type >= TL_WRITE_ALLOW_WRITE)
|
|
||||||
(*system_count)++;
|
|
||||||
|
|
||||||
/* 'current' is an index, that's why '<=' below. */
|
|
||||||
if (*system_count > 0 && *system_count <= current)
|
|
||||||
{
|
|
||||||
my_error(ER_WRONG_LOCK_OF_SYSTEM_TABLE, MYF(0));
|
|
||||||
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) or by a privileged thread.
|
|
||||||
*/
|
|
||||||
if (!called_by_privileged_thread)
|
|
||||||
return check_if_log_table_locking_is_allowed(sql_command, type, table);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Name is here without an extension */
|
|
||||||
|
|
||||||
int ha_myisam::open(const char *name, int mode, uint test_if_locked)
|
int ha_myisam::open(const char *name, int mode, uint test_if_locked)
|
||||||
{
|
{
|
||||||
MI_KEYDEF *keyinfo;
|
MI_KEYDEF *keyinfo;
|
||||||
|
@ -60,11 +60,6 @@ class ha_myisam: public handler
|
|||||||
uint max_supported_key_part_length() const { return MI_MAX_KEY_LENGTH; }
|
uint max_supported_key_part_length() const { return MI_MAX_KEY_LENGTH; }
|
||||||
uint checksum() const;
|
uint checksum() const;
|
||||||
|
|
||||||
virtual bool check_if_locking_is_allowed(uint sql_command,
|
|
||||||
ulong type, TABLE *table,
|
|
||||||
uint count, uint current,
|
|
||||||
uint *system_count,
|
|
||||||
bool called_by_logger_thread);
|
|
||||||
int open(const char *name, int mode, uint test_if_locked);
|
int open(const char *name, int mode, uint test_if_locked);
|
||||||
int close(void);
|
int close(void);
|
||||||
int write_row(uchar * buf);
|
int write_row(uchar * buf);
|
||||||
|
@ -258,7 +258,8 @@ static int run_test(const char *filename)
|
|||||||
continue;
|
continue;
|
||||||
create_key(key,j);
|
create_key(key,j);
|
||||||
my_errno=0;
|
my_errno=0;
|
||||||
if ((error = mi_rkey(file,read_record,0,key,0,HA_READ_KEY_EXACT)))
|
if ((error = mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,
|
||||||
|
HA_READ_KEY_EXACT)))
|
||||||
{
|
{
|
||||||
if (verbose || (flags[j] >= 1 ||
|
if (verbose || (flags[j] >= 1 ||
|
||||||
(error && my_errno != HA_ERR_KEY_NOT_FOUND)))
|
(error && my_errno != HA_ERR_KEY_NOT_FOUND)))
|
||||||
@ -285,7 +286,7 @@ static int run_test(const char *filename)
|
|||||||
{
|
{
|
||||||
create_key(key,i);
|
create_key(key,i);
|
||||||
my_errno=0;
|
my_errno=0;
|
||||||
error=mi_rkey(file,read_record,0,key,0,HA_READ_KEY_EXACT);
|
error=mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT);
|
||||||
if (verbose ||
|
if (verbose ||
|
||||||
(error == 0 && flags[i] == 0 && unique_key) ||
|
(error == 0 && flags[i] == 0 && unique_key) ||
|
||||||
(error && (flags[i] != 0 || my_errno != HA_ERR_KEY_NOT_FOUND)))
|
(error && (flags[i] != 0 || my_errno != HA_ERR_KEY_NOT_FOUND)))
|
||||||
|
@ -263,7 +263,7 @@ int main(int argc, char *argv[])
|
|||||||
if (!j)
|
if (!j)
|
||||||
for (j=999 ; j>0 && key1[j] == 0 ; j--) ;
|
for (j=999 ; j>0 && key1[j] == 0 ; j--) ;
|
||||||
sprintf(key,"%6d",j);
|
sprintf(key,"%6d",j);
|
||||||
if (mi_rkey(file,read_record,0,key,0,HA_READ_KEY_EXACT))
|
if (mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT))
|
||||||
{
|
{
|
||||||
printf("Test in loop: Can't find key: \"%s\"\n",key);
|
printf("Test in loop: Can't find key: \"%s\"\n",key);
|
||||||
goto err;
|
goto err;
|
||||||
@ -291,7 +291,7 @@ int main(int argc, char *argv[])
|
|||||||
if (j != 0)
|
if (j != 0)
|
||||||
{
|
{
|
||||||
sprintf(key,"%6d",j);
|
sprintf(key,"%6d",j);
|
||||||
if (mi_rkey(file,read_record,0,key,0,HA_READ_KEY_EXACT))
|
if (mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT))
|
||||||
{
|
{
|
||||||
printf("can't find key1: \"%s\"\n",key);
|
printf("can't find key1: \"%s\"\n",key);
|
||||||
goto err;
|
goto err;
|
||||||
@ -325,7 +325,7 @@ int main(int argc, char *argv[])
|
|||||||
if (j != 0)
|
if (j != 0)
|
||||||
{
|
{
|
||||||
sprintf(key,"%6d",j);
|
sprintf(key,"%6d",j);
|
||||||
if (mi_rkey(file,read_record,0,key,0,HA_READ_KEY_EXACT))
|
if (mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT))
|
||||||
{
|
{
|
||||||
printf("can't find key1: \"%s\"\n",key);
|
printf("can't find key1: \"%s\"\n",key);
|
||||||
goto err;
|
goto err;
|
||||||
@ -377,7 +377,7 @@ int main(int argc, char *argv[])
|
|||||||
DBUG_PRINT("progpos",("first - next -> last - prev -> first"));
|
DBUG_PRINT("progpos",("first - next -> last - prev -> first"));
|
||||||
if (verbose) printf(" Using key: \"%s\" Keys: %d\n",key,dupp_keys);
|
if (verbose) printf(" Using key: \"%s\" Keys: %d\n",key,dupp_keys);
|
||||||
|
|
||||||
if (mi_rkey(file,read_record,0,key,0,HA_READ_KEY_EXACT))
|
if (mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT))
|
||||||
goto err;
|
goto err;
|
||||||
if (mi_rsame(file,read_record2,-1))
|
if (mi_rsame(file,read_record2,-1))
|
||||||
goto err;
|
goto err;
|
||||||
@ -422,7 +422,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check of mi_rnext_same */
|
/* Check of mi_rnext_same */
|
||||||
if (mi_rkey(file,read_record,0,key,0,HA_READ_KEY_EXACT))
|
if (mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT))
|
||||||
goto err;
|
goto err;
|
||||||
ant=1;
|
ant=1;
|
||||||
while (!mi_rnext_same(file,read_record3) && ant < dupp_keys+10)
|
while (!mi_rnext_same(file,read_record3) && ant < dupp_keys+10)
|
||||||
@ -496,7 +496,7 @@ int main(int argc, char *argv[])
|
|||||||
goto err;
|
goto err;
|
||||||
if (bcmp(read_record2,read_record3,reclength))
|
if (bcmp(read_record2,read_record3,reclength))
|
||||||
printf("Can't find last record\n");
|
printf("Can't find last record\n");
|
||||||
|
#ifdef NOT_ANYMORE
|
||||||
if (!silent)
|
if (!silent)
|
||||||
puts("- Test read key-part");
|
puts("- Test read key-part");
|
||||||
strmov(key2,key);
|
strmov(key2,key);
|
||||||
@ -514,12 +514,14 @@ int main(int argc, char *argv[])
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (dupp_keys > 2)
|
if (dupp_keys > 2)
|
||||||
{
|
{
|
||||||
if (!silent)
|
if (!silent)
|
||||||
printf("- Read key (first) - next - delete - next -> last\n");
|
printf("- Read key (first) - next - delete - next -> last\n");
|
||||||
DBUG_PRINT("progpos",("first - next - delete - next -> last"));
|
DBUG_PRINT("progpos",("first - next - delete - next -> last"));
|
||||||
if (mi_rkey(file,read_record,0,key,0,HA_READ_KEY_EXACT)) goto err;
|
if (mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT))
|
||||||
|
goto err;
|
||||||
if (mi_rnext(file,read_record3,0)) goto err;
|
if (mi_rnext(file,read_record3,0)) goto err;
|
||||||
if (mi_delete(file,read_record3)) goto err;
|
if (mi_delete(file,read_record3)) goto err;
|
||||||
opt_delete++;
|
opt_delete++;
|
||||||
@ -555,7 +557,8 @@ int main(int argc, char *argv[])
|
|||||||
if (!silent)
|
if (!silent)
|
||||||
printf("- Read first - delete - next -> last\n");
|
printf("- Read first - delete - next -> last\n");
|
||||||
DBUG_PRINT("progpos",("first - delete - next -> last"));
|
DBUG_PRINT("progpos",("first - delete - next -> last"));
|
||||||
if (mi_rkey(file,read_record3,0,key,0,HA_READ_KEY_EXACT)) goto err;
|
if (mi_rkey(file,read_record3,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT))
|
||||||
|
goto err;
|
||||||
if (mi_delete(file,read_record3)) goto err;
|
if (mi_delete(file,read_record3)) goto err;
|
||||||
opt_delete++;
|
opt_delete++;
|
||||||
ant=1;
|
ant=1;
|
||||||
@ -618,10 +621,10 @@ int main(int argc, char *argv[])
|
|||||||
copy_key(file,(uint) i,(uchar*) read_record,(uchar*) key);
|
copy_key(file,(uint) i,(uchar*) read_record,(uchar*) key);
|
||||||
copy_key(file,(uint) i,(uchar*) read_record2,(uchar*) key2);
|
copy_key(file,(uint) i,(uchar*) read_record2,(uchar*) key2);
|
||||||
min_key.key= key;
|
min_key.key= key;
|
||||||
min_key.length= USE_WHOLE_KEY;
|
min_key.keypart_map= HA_WHOLE_KEY;
|
||||||
min_key.flag= HA_READ_KEY_EXACT;
|
min_key.flag= HA_READ_KEY_EXACT;
|
||||||
max_key.key= key2;
|
max_key.key= key2;
|
||||||
max_key.length= USE_WHOLE_KEY;
|
max_key.keypart_map= HA_WHOLE_KEY;
|
||||||
max_key.flag= HA_READ_AFTER_KEY;
|
max_key.flag= HA_READ_AFTER_KEY;
|
||||||
|
|
||||||
range_records= mi_records_in_range(file,(int) i, &min_key, &max_key);
|
range_records= mi_records_in_range(file,(int) i, &min_key, &max_key);
|
||||||
|
@ -243,8 +243,8 @@ int test_read(MI_INFO *file,int id)
|
|||||||
for (i=0 ; i < 100 ; i++)
|
for (i=0 ; i < 100 ; i++)
|
||||||
{
|
{
|
||||||
find=rnd(100000);
|
find=rnd(100000);
|
||||||
if (!mi_rkey(file,record.id,1,(uchar*) &find,
|
if (!mi_rkey(file,record.id,1,(uchar*) &find, HA_WHOLE_KEY,
|
||||||
sizeof(find),HA_READ_KEY_EXACT))
|
HA_READ_KEY_EXACT))
|
||||||
found++;
|
found++;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -426,8 +426,8 @@ int test_update(MI_INFO *file,int id,int lock_type)
|
|||||||
{
|
{
|
||||||
tmp=rnd(100000);
|
tmp=rnd(100000);
|
||||||
int4store(find,tmp);
|
int4store(find,tmp);
|
||||||
if (!mi_rkey(file,record.id,1,(uchar*) find,
|
if (!mi_rkey(file,record.id,1,(uchar*) find, HA_WHOLE_KEY,
|
||||||
sizeof(find),HA_READ_KEY_EXACT))
|
HA_READ_KEY_EXACT))
|
||||||
found++;
|
found++;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user