Merge weblab.(none):/home/marcsql/TREE/mysql-5.1-base

into  weblab.(none):/home/marcsql/TREE/mysql-5.1-rt-merge
This commit is contained in:
malff/marcsql@weblab.(none) 2007-08-20 11:13:31 -06:00
commit 1c27dd1d67
53 changed files with 7833 additions and 7080 deletions

View File

@ -1308,8 +1308,8 @@ static char *cover_definer_clause_in_trigger(const char *trigger_def_str,
@note This function will go away when WL#3995 is implemented. @note This function will go away when WL#3995 is implemented.
@param[in] def_str CREATE FUNCTION|PROCEDURE statement string. @param[in] def_str CREATE FUNCTION|PROCEDURE statement string.
@param[in] def_length length of the def_str. @param[in] def_str_length length of the def_str.
@return pointer to the new allocated query string. @return pointer to the new allocated query string.
*/ */

View File

@ -750,7 +750,7 @@ void *thd_memdup(MYSQL_THD thd, const void* str, unsigned int size);
@param thd user thread connection handle @param thd user thread connection handle
@param lex_str pointer to LEX_STRING object to be initialized @param lex_str pointer to LEX_STRING object to be initialized
@param str initializer to be copied into lex_str @param str initializer to be copied into lex_str
@param length length of str, in bytes @param size length of str, in bytes
@param allocate_lex_string flag: if TRUE, allocate new LEX_STRING object, @param allocate_lex_string flag: if TRUE, allocate new LEX_STRING object,
instead of using lex_str value instead of using lex_str value
@return NULL on failure, or pointer to the LEX_STRING object @return NULL on failure, or pointer to the LEX_STRING object
@ -773,7 +773,7 @@ void thd_get_xid(const MYSQL_THD thd, MYSQL_XID *xid);
Invalidate the query cache for a given table. Invalidate the query cache for a given table.
@param thd user thread connection handle @param thd user thread connection handle
@param key databasename\0tablename\0 @param key databasename\\0tablename\\0
@param key_length length of key in bytes, including the NUL bytes @param key_length length of key in bytes, including the NUL bytes
@param using_trx flag: TRUE if using transactions, FALSE otherwise @param using_trx flag: TRUE if using transactions, FALSE otherwise
*/ */

View File

@ -1,100 +1,70 @@
CREATE DATABASE IF NOT EXISTS events_test; drop database if exists events_test;
USE events_test; create database if not exists events_test;
"We use procedure here because its statements won't be logged into the general log" use events_test;
"If we had used normal select that are logged in different ways depending on whether"
"the test suite is run in normal mode or with --ps-protocol" We use procedure here because its statements won't be
CREATE procedure select_general_log() logged into the general log. If we had used normal select
BEGIN that are logged in different ways depending on whether the
SELECT user_host, argument FROM mysql.general_log WHERE argument LIKE '%alabala%'; test suite is run in normal mode or with --ps-protocol
END|
"Check General Query Log" create procedure select_general_log()
CALL select_general_log(); begin
select user_host, argument from mysql.general_log
where argument like '%events_logs_test%';
end|
Check that general query log works, but sub-statements
of the stored procedure do not leave traces in it.
truncate mysql.general_log;
select 'events_logs_tests' as outside_event;
outside_event
events_logs_tests
call select_general_log();
user_host argument user_host argument
USER_HOST CREATE procedure select_general_log() USER_HOST select 'events_logs_tests' as outside_event
BEGIN
SELECT user_host, argument FROM mysql.general_log WHERE argument LIKE '%alabala%'; Check that unlike sub-statements of stored procedures,
END sub-statements of events are present in the general log.
SET GLOBAL event_scheduler=on;
TRUNCATE mysql.general_log; set global event_scheduler=on;
CREATE EVENT log_general ON SCHEDULE EVERY 1 MINUTE DO SELECT 'alabala', SLEEP(1) FROM DUAL; truncate mysql.general_log;
"Wait the scheduler to start" create event ev_log_general on schedule at now() on completion not preserve do select 'events_logs_test' as inside_event;
"Should see 2 rows - the 'SELECT' is in the middle. The other two are selects from general_log" call select_general_log();
CALL select_general_log();
user_host argument user_host argument
USER_HOST CREATE EVENT log_general ON SCHEDULE EVERY 1 MINUTE DO SELECT 'alabala', SLEEP(1) FROM DUAL USER_HOST create event ev_log_general on schedule at now() on completion not preserve do select 'events_logs_test' as inside_event
USER_HOST SELECT 'alabala', SLEEP(1) FROM DUAL USER_HOST select 'events_logs_test' as inside_event
DROP PROCEDURE select_general_log;
DROP EVENT log_general; Check slow query log
SET GLOBAL event_scheduler=off;
"Check slow query log" Ensure that slow logging is on
"Save the values" show variables like 'log_slow_queries';
SET @old_global_long_query_time:=(select get_value());
SET @old_session_long_query_time:=@@long_query_time;
SHOW VARIABLES LIKE 'log_slow_queries';
Variable_name Value Variable_name Value
log_slow_queries ON log_slow_queries ON
DROP FUNCTION get_value;
"Make it quite long" Demonstrate that session value has no effect
SET SESSION long_query_time=300;
TRUNCATE mysql.slow_log; set @@session.long_query_time=1;
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; set @@global.long_query_time=300;
user_host query_time db sql_text truncate mysql.slow_log;
"Set new values" create event ev_log_general on schedule at now() on completion not preserve
SET GLOBAL long_query_time=4; do select 'events_logs_test' as inside_event, sleep(1.5);
SET SESSION long_query_time=0.5;
"Check that logging is working" Nothing should be logged
SELECT SLEEP(2);
SLEEP(2) select user_host, db, sql_text from mysql.slow_log where sql_text not like 'create event%';
0 user_host db sql_text
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; set @@global.long_query_time=1;
user_host query_time db sql_text truncate mysql.slow_log;
USER_HOST SLEEPVAL events_test SELECT SLEEP(2) create event ev_log_general on schedule at now() on completion not preserve
SET SESSION long_query_time=300; do select 'events_logs_test' as inside_event, sleep(1.5);
"Make it quite long"
TRUNCATE mysql.slow_log; Event sub-statement should be logged.
CREATE TABLE slow_event_test (slo_val tinyint, val tinyint);
SET SESSION long_query_time=1; select user_host, db, sql_text from mysql.slow_log where sql_text not like 'create event%';
"This won't go to the slow log" user_host db sql_text
SELECT * FROM slow_event_test; USER_HOST events_test select 'events_logs_test' as inside_event, sleep(1.5)
slo_val val drop database events_test;
SET SESSION long_query_time=1; set global event_scheduler=off;
SET GLOBAL event_scheduler=on; set @@global.long_query_time=default;
SET GLOBAL long_query_time=20; set @@session.long_query_time=default;
CREATE EVENT long_event ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(1.5);
"Sleep some more time than the actual event run will take"
SHOW VARIABLES LIKE 'event_scheduler';
Variable_name Value
event_scheduler ON
"Check our table. Should see 1 row"
SELECT * FROM slow_event_test;
slo_val val
20 0
"Check slow log. Should not see anything because 1.5 is under the threshold of 20 for GLOBAL, though over SESSION which is 1"
"This should show that the GLOBAL value is regarded and not the SESSION one of the current connection"
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
user_host query_time db sql_text
"Another test to show that GLOBAL is regarded and not SESSION."
"This should go to the slow log"
SET SESSION long_query_time=10;
DROP EVENT long_event;
SET GLOBAL long_query_time=1;
CREATE EVENT long_event2 ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(2);
"Sleep some more time than the actual event run will take"
"Check our table. Should see 2 rows"
SELECT * FROM slow_event_test;
slo_val val
20 0
1 0
"Check slow log. Should see 1 row because 2 is over the threshold of 1 for GLOBAL, though under SESSION which is 10"
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
user_host query_time db sql_text
USER_HOST SLEEPVAL events_test INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(2)
DROP EVENT long_event2;
"Make it quite long"
SET SESSION long_query_time=300;
TRUNCATE mysql.slow_log;
DROP TABLE slow_event_test;
SET GLOBAL long_query_time =@old_global_long_query_time;
SET SESSION long_query_time =@old_session_long_query_time;
DROP DATABASE events_test;
SET GLOBAL event_scheduler=off;

View File

@ -13,9 +13,9 @@ insert into t1 values (1);
lock tables t1 read; lock tables t1 read;
update low_priority t1 set n = 4; update low_priority t1 set n = 4;
select n from t1; select n from t1;
unlock tables;
n n
1 1
unlock tables;
drop table t1; drop table t1;
create table t1 (a int, b int); create table t1 (a int, b int);
create table t2 (c int, d int); create table t2 (c int, d int);
@ -43,6 +43,7 @@ insert t1 select * from t2;
drop table t2; drop table t2;
ERROR 42S02: Table 'test.t2' doesn't exist ERROR 42S02: Table 'test.t2' doesn't exist
drop table t1; drop table t1;
End of 4.1 tests
create table t1(a int); create table t1(a int);
lock tables t1 write; lock tables t1 write;
show columns from t1; show columns from t1;
@ -91,10 +92,11 @@ DROP DATABASE mysqltest_1;
ERROR HY000: Can't drop database 'mysqltest_1'; database doesn't exist ERROR HY000: Can't drop database 'mysqltest_1'; database doesn't exist
create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) engine=innodb; create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) engine=innodb;
lock tables t1 write; lock tables t1 write;
alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; // alter table t1 auto_increment=0;
alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; // alter table t1 auto_increment=0;
unlock tables; unlock tables;
drop table t1; drop table t1;
End of 5.0 tests
create table t1 (i int); create table t1 (i int);
lock table t1 read; lock table t1 read;
update t1 set i= 10;; update t1 set i= 10;;
@ -104,4 +106,11 @@ i
ERROR 70100: Query execution was interrupted ERROR 70100: Query execution was interrupted
unlock tables; unlock tables;
drop table t1; drop table t1;
drop table if exists t1;
create table t1 (a int) ENGINE=MEMORY;
--> client 2
handler t1 open;
ERROR HY000: Table storage engine for 't1' doesn't have this option
--> client 1
drop table t1;
End of 5.1 tests End of 5.1 tests

View File

@ -273,6 +273,16 @@ create table VAR_SAMP(a int);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VAR_SAMP(a int)' at line 1 ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VAR_SAMP(a int)' at line 1
create table VAR_SAMP (a int); create table VAR_SAMP (a int);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VAR_SAMP (a int)' at line 1 ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VAR_SAMP (a int)' at line 1
DROP TABLE IF EXISTS table_25930_a;
DROP TABLE IF EXISTS table_25930_b;
SET SQL_MODE = 'ANSI_QUOTES';
CREATE TABLE table_25930_a ( "blah" INT );
CREATE TABLE table_25930_b SELECT "blah" - 1 FROM table_25930_a;
desc table_25930_b;
Field Type Null Key Default Extra
"blah" - 1 bigint(12) YES NULL
DROP TABLE table_25930_a;
DROP TABLE table_25930_b;
SET @@sql_mode=@save_sql_mode; SET @@sql_mode=@save_sql_mode;
select pi(3.14); select pi(3.14);
ERROR 42000: Incorrect parameter count in the call to native function 'pi' ERROR 42000: Incorrect parameter count in the call to native function 'pi'

View File

@ -1650,6 +1650,30 @@ a (select count(*) from t2)
3 0 3 0
4 0 4 0
drop table t1,t2; drop table t1,t2;
DROP DATABASE IF EXISTS bug30269;
CREATE DATABASE bug30269;
USE bug30269;
CREATE TABLE test1 (id int, name varchar(23));
CREATE VIEW view1 AS SELECT id FROM test1;
INSERT INTO test1 VALUES (5, 'testit');
GRANT SELECT (id) ON TABLE bug30269.test1 TO 'bug30269'@'localhost';
GRANT SELECT ON TABLE bug30269.view1 TO 'bug30269'@'localhost';
set global query_cache_size= 81920;
USE bug30269;
show status like 'Qcache_queries_in_cache';
Variable_name Value
Qcache_queries_in_cache 0
SELECT id FROM test1 WHERE id>2;
id
5
SELECT id FROM view1 WHERE id>2;
id
5
show status like 'Qcache_queries_in_cache';
Variable_name Value
Qcache_queries_in_cache 0
DROP DATABASE bug30269;
DROP USER 'bug30269'@'localhost';
set GLOBAL query_cache_type=default; set GLOBAL query_cache_type=default;
set GLOBAL query_cache_limit=default; set GLOBAL query_cache_limit=default;
set GLOBAL query_cache_min_res_unit=default; set GLOBAL query_cache_min_res_unit=default;

View File

@ -1,115 +1,87 @@
# Can't test with embedded server that doesn't support grants # Can't test with embedded server that doesn't support grants
-- source include/not_embedded.inc -- source include/not_embedded.inc
CREATE DATABASE IF NOT EXISTS events_test; --disable_warnings
USE events_test; drop database if exists events_test;
--echo "We use procedure here because its statements won't be logged into the general log" --enable_warnings
--echo "If we had used normal select that are logged in different ways depending on whether" create database if not exists events_test;
--echo "the test suite is run in normal mode or with --ps-protocol" use events_test;
--echo
--echo We use procedure here because its statements won't be
--echo logged into the general log. If we had used normal select
--echo that are logged in different ways depending on whether the
--echo test suite is run in normal mode or with --ps-protocol
--echo
delimiter |; delimiter |;
CREATE procedure select_general_log() create procedure select_general_log()
BEGIN begin
SELECT user_host, argument FROM mysql.general_log WHERE argument LIKE '%alabala%'; select user_host, argument from mysql.general_log
END| where argument like '%events_logs_test%';
delimiter ;|
--echo "Check General Query Log"
--replace_column 1 USER_HOST
CALL select_general_log();
SET GLOBAL event_scheduler=on;
TRUNCATE mysql.general_log;
CREATE EVENT log_general ON SCHEDULE EVERY 1 MINUTE DO SELECT 'alabala', SLEEP(1) FROM DUAL;
--echo "Wait the scheduler to start"
--sleep 1.5
--echo "Should see 2 rows - the 'SELECT' is in the middle. The other two are selects from general_log"
--replace_column 1 USER_HOST
CALL select_general_log();
DROP PROCEDURE select_general_log;
DROP EVENT log_general;
SET GLOBAL event_scheduler=off;
--echo "Check slow query log"
--disable_query_log
DELIMITER |;
CREATE FUNCTION get_value()
returns INT
deterministic
BEGIN
DECLARE var_name CHAR(255);
DECLARE var_val INT;
DECLARE done INT DEFAULT 0;
DECLARE cur1 CURSOR FOR SHOW GLOBAL VARIABLES LIKE 'long_query_time';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
FETCH cur1 INTO var_name, var_val;
CLOSE cur1;
RETURN var_val;
end| end|
DELIMITER ;| delimiter ;|
--enable_query_log --echo
--echo "Save the values" --echo Check that general query log works, but sub-statements
SET @old_global_long_query_time:=(select get_value()); --echo of the stored procedure do not leave traces in it.
SET @old_session_long_query_time:=@@long_query_time; --echo
SHOW VARIABLES LIKE 'log_slow_queries'; truncate mysql.general_log;
DROP FUNCTION get_value; # Logging format in ps protocol is slightly different
--echo "Make it quite long" --disable_ps_protocol
SET SESSION long_query_time=300; select 'events_logs_tests' as outside_event;
TRUNCATE mysql.slow_log; --enable_ps_protocol
--replace_column 1 USER_HOST --replace_column 1 USER_HOST
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; call select_general_log();
--echo "Set new values" --echo
SET GLOBAL long_query_time=4; --echo Check that unlike sub-statements of stored procedures,
SET SESSION long_query_time=0.5; --echo sub-statements of events are present in the general log.
--echo "Check that logging is working" --echo
SELECT SLEEP(2); set global event_scheduler=on;
--replace_column 1 USER_HOST 2 SLEEPVAL truncate mysql.general_log;
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; create event ev_log_general on schedule at now() on completion not preserve do select 'events_logs_test' as inside_event;
SET SESSION long_query_time=300; --let $wait_condition=select count(*)=0 from information_schema.events where event_name='ev_log_general'
--echo "Make it quite long"
TRUNCATE mysql.slow_log;
CREATE TABLE slow_event_test (slo_val tinyint, val tinyint);
SET SESSION long_query_time=1;
--echo "This won't go to the slow log"
SELECT * FROM slow_event_test;
SET SESSION long_query_time=1;
SET GLOBAL event_scheduler=on;
SET GLOBAL long_query_time=20;
CREATE EVENT long_event ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(1.5);
--echo "Sleep some more time than the actual event run will take"
--sleep 2
SHOW VARIABLES LIKE 'event_scheduler';
--echo "Check our table. Should see 1 row"
SELECT * FROM slow_event_test;
--echo "Check slow log. Should not see anything because 1.5 is under the threshold of 20 for GLOBAL, though over SESSION which is 1"
--echo "This should show that the GLOBAL value is regarded and not the SESSION one of the current connection"
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
--echo "Another test to show that GLOBAL is regarded and not SESSION."
--echo "This should go to the slow log"
SET SESSION long_query_time=10;
DROP EVENT long_event;
SET GLOBAL long_query_time=1;
CREATE EVENT long_event2 ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(2);
--echo "Sleep some more time than the actual event run will take"
let $wait_timeout= 30;
let $wait_condition= SELECT COUNT(*) = 1 FROM mysql.slow_log;
--source include/wait_condition.inc --source include/wait_condition.inc
--echo "Check our table. Should see 2 rows" --replace_column 1 USER_HOST
SELECT * FROM slow_event_test; call select_general_log();
--echo "Check slow log. Should see 1 row because 2 is over the threshold of 1 for GLOBAL, though under SESSION which is 10"
--replace_column 1 USER_HOST 2 SLEEPVAL
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
DROP EVENT long_event2;
--echo "Make it quite long"
SET SESSION long_query_time=300;
TRUNCATE mysql.slow_log;
DROP TABLE slow_event_test;
SET GLOBAL long_query_time =@old_global_long_query_time;
SET SESSION long_query_time =@old_session_long_query_time;
DROP DATABASE events_test; --echo
--echo Check slow query log
--echo
--echo Ensure that slow logging is on
show variables like 'log_slow_queries';
--echo
--echo Demonstrate that session value has no effect
--echo
set @@session.long_query_time=1;
set @@global.long_query_time=300;
truncate mysql.slow_log;
create event ev_log_general on schedule at now() on completion not preserve
do select 'events_logs_test' as inside_event, sleep(1.5);
--let $wait_condition=select count(*)=0 from information_schema.events where event_name='ev_log_general'
--source include/wait_condition.inc
--echo
--echo Nothing should be logged
--echo
--replace_column 1 USER_HOST
select user_host, db, sql_text from mysql.slow_log where sql_text not like 'create event%';
set @@global.long_query_time=1;
truncate mysql.slow_log;
create event ev_log_general on schedule at now() on completion not preserve
do select 'events_logs_test' as inside_event, sleep(1.5);
--let $wait_condition=select count(*)=0 from information_schema.events where event_name='ev_log_general'
--source include/wait_condition.inc
--echo
--echo Event sub-statement should be logged.
--echo
--replace_column 1 USER_HOST
select user_host, db, sql_text from mysql.slow_log where sql_text not like 'create event%';
drop database events_test;
set global event_scheduler=off;
set @@global.long_query_time=default;
set @@session.long_query_time=default;
SET GLOBAL event_scheduler=off; #
# Safety
#
let $wait_condition= let $wait_condition=
select count(*) = 0 from information_schema.processlist select count(*) = 0 from information_schema.processlist
where db='events_test' and command = 'Connect' and user=current_user(); where db='events_test' and command = 'Connect' and user=current_user();

View File

@ -16,10 +16,16 @@ lock tables t1 write;
connection writer; connection writer;
send update low_priority t1 set n = 4; send update low_priority t1 set n = 4;
connection reader; connection reader;
--sleep 2 let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "update low_priority t1 set n = 4";
--source include/wait_condition.inc
send select n from t1; send select n from t1;
connection locker; connection locker;
--sleep 2 let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "select n from t1";
--source include/wait_condition.inc
unlock tables; unlock tables;
connection writer; connection writer;
reap; reap;
@ -34,15 +40,15 @@ lock tables t1 read;
connection writer; connection writer;
send update low_priority t1 set n = 4; send update low_priority t1 set n = 4;
connection reader; connection reader;
--sleep 2 let $wait_condition=
send select n from t1; select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "update low_priority t1 set n = 4";
--source include/wait_condition.inc
select n from t1;
connection locker; connection locker;
--sleep 2
unlock tables; unlock tables;
connection writer; connection writer;
reap; reap;
connection reader;
reap;
drop table t1; drop table t1;
# #
@ -58,13 +64,9 @@ insert into t1 values(2,2);
insert into t2 values(1,2); insert into t2 values(1,2);
lock table t1 read; lock table t1 read;
connection writer; connection writer;
--sleep 2 update t1,t2 set c=a where b=d;
send update t1,t2 set c=a where b=d;
connection reader; connection reader;
--sleep 2
select c from t2; select c from t2;
connection writer;
reap;
connection locker; connection locker;
drop table t1; drop table t1;
drop table t2; drop table t2;
@ -73,7 +75,7 @@ drop table t2;
# Test problem when using locks on many tables and droping a table that # Test problem when using locks on many tables and droping a table that
# is to-be-locked by another thread # is to-be-locked by another thread
# #
#
connection locker; connection locker;
create table t1 (a int); create table t1 (a int);
create table t2 (a int); create table t2 (a int);
@ -81,6 +83,10 @@ lock table t1 write, t2 write;
connection reader; connection reader;
send insert t1 select * from t2; send insert t1 select * from t2;
connection locker; connection locker;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "insert t1 select * from t2";
--source include/wait_condition.inc
drop table t2; drop table t2;
connection reader; connection reader;
--error 1146 --error 1146
@ -99,6 +105,10 @@ lock table t1 write, t2 write, t1 as t1_2 write, t2 as t2_2 write;
connection reader; connection reader;
send insert t1 select * from t2; send insert t1 select * from t2;
connection locker; connection locker;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info = "insert t1 select * from t2";
--source include/wait_condition.inc
drop table t2; drop table t2;
connection reader; connection reader;
--error 1146 --error 1146
@ -107,7 +117,7 @@ connection locker;
drop table t1; drop table t1;
# End of 4.1 tests --echo End of 4.1 tests
# #
# BUG#9998 - MySQL client hangs on USE "database" # BUG#9998 - MySQL client hangs on USE "database"
@ -131,15 +141,18 @@ connection locker;
use mysql; use mysql;
LOCK TABLES columns_priv WRITE, db WRITE, host WRITE, user WRITE; LOCK TABLES columns_priv WRITE, db WRITE, host WRITE, user WRITE;
FLUSH TABLES; FLUSH TABLES;
--sleep 1
# #
connection reader; connection reader;
use mysql; use mysql;
#NOTE: This must be a multi-table select, otherwise the deadlock will not occur #NOTE: This must be a multi-table select, otherwise the deadlock will not occur
send SELECT user.Select_priv FROM user, db WHERE user.user = db.user LIMIT 1; send SELECT user.Select_priv FROM user, db WHERE user.user = db.user LIMIT 1;
--sleep 1
# #
connection locker; connection locker;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Locked" and info =
"SELECT user.Select_priv FROM user, db WHERE user.user = db.user LIMIT 1";
--source include/wait_condition.inc
# Make test case independent from earlier grants. # Make test case independent from earlier grants.
--replace_result "Table is already up to date" "OK" --replace_result "Table is already up to date" "OK"
OPTIMIZE TABLES columns_priv, db, host, user; OPTIMIZE TABLES columns_priv, db, host, user;
@ -163,10 +176,13 @@ LOCK TABLE t1 WRITE;
# This waits until t1 is unlocked. # This waits until t1 is unlocked.
connection locker; connection locker;
send FLUSH TABLES WITH READ LOCK; send FLUSH TABLES WITH READ LOCK;
--sleep 1
# #
# This must not block.
connection writer; connection writer;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Flushing tables" and info = "FLUSH TABLES WITH READ LOCK";
--source include/wait_condition.inc
# This must not block.
CREATE TABLE t2 (c1 int); CREATE TABLE t2 (c1 int);
UNLOCK TABLES; UNLOCK TABLES;
# #
@ -187,10 +203,13 @@ LOCK TABLE t1 WRITE;
# This waits until t1 is unlocked. # This waits until t1 is unlocked.
connection locker; connection locker;
send FLUSH TABLES WITH READ LOCK; send FLUSH TABLES WITH READ LOCK;
--sleep 1
# #
# This must not block. # This must not block.
connection writer; connection writer;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Flushing tables" and info = "FLUSH TABLES WITH READ LOCK";
--source include/wait_condition.inc
--error 1100 --error 1100
CREATE TABLE t2 AS SELECT * FROM t1; CREATE TABLE t2 AS SELECT * FROM t1;
UNLOCK TABLES; UNLOCK TABLES;
@ -219,11 +238,15 @@ FLUSH TABLES WITH READ LOCK;
# wait in wait_if_global_read_lock(). # wait in wait_if_global_read_lock().
connection con2; connection con2;
send DROP DATABASE mysqltest_1; send DROP DATABASE mysqltest_1;
--sleep 1
# #
# With bug in place: try to acquire LOCK_mysql_create_table... # With bug in place: try to acquire LOCK_mysql_create_table...
# When fixed: Reject dropping db because of the read lock. # When fixed: Reject dropping db because of the read lock.
connection con1; connection con1;
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Waiting for release of readlock"
and info = "DROP DATABASE mysqltest_1";
--source include/wait_condition.inc
--error ER_CANT_UPDATE_WITH_READLOCK --error ER_CANT_UPDATE_WITH_READLOCK
DROP DATABASE mysqltest_1; DROP DATABASE mysqltest_1;
UNLOCK TABLES; UNLOCK TABLES;
@ -249,17 +272,18 @@ create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) e
--enable_warnings --enable_warnings
lock tables t1 write; lock tables t1 write;
connection writer; connection writer;
--sleep 2 send alter table t1 auto_increment=0;
delimiter //;
send alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; //
delimiter ;//
connection reader; connection reader;
--sleep 2 let $wait_condition=
delimiter //; select count(*) = 1 from information_schema.processlist
send alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; // where state = "Locked" and info = "alter table t1 auto_increment=0";
delimiter ;// --source include/wait_condition.inc
send alter table t1 auto_increment=0;
connection locker; connection locker;
--sleep 2 let $wait_condition=
select count(*) = 2 from information_schema.processlist
where state = "Locked" and info = "alter table t1 auto_increment=0";
--source include/wait_condition.inc
unlock tables; unlock tables;
connection writer; connection writer;
reap; reap;
@ -267,8 +291,8 @@ connection reader;
reap; reap;
connection locker; connection locker;
drop table t1; drop table t1;
#
# End of 5.0 tests --echo End of 5.0 tests
# #
@ -304,4 +328,19 @@ unlock tables;
connection default; connection default;
drop table t1; drop table t1;
#
# Bug#25856 - HANDLER table OPEN in one connection lock DROP TABLE in another one
#
--disable_warnings
drop table if exists t1;
--enable_warnings
create table t1 (a int) ENGINE=MEMORY;
--echo --> client 2
connection locker;
--error 1031
handler t1 open;
--echo --> client 1
connection default;
drop table t1;
--echo End of 5.1 tests --echo End of 5.1 tests

View File

@ -363,6 +363,28 @@ create table VAR_SAMP(a int);
--error ER_PARSE_ERROR --error ER_PARSE_ERROR
create table VAR_SAMP (a int); create table VAR_SAMP (a int);
#
# Bug#25930 (CREATE TABLE x SELECT ... parses columns wrong when ran with
# ANSI_QUOTES mode)
#
--disable_warnings
DROP TABLE IF EXISTS table_25930_a;
DROP TABLE IF EXISTS table_25930_b;
--enable_warnings
SET SQL_MODE = 'ANSI_QUOTES';
CREATE TABLE table_25930_a ( "blah" INT );
CREATE TABLE table_25930_b SELECT "blah" - 1 FROM table_25930_a;
# The lexer used to chop the first <">,
# not marking the start of the token "blah" correctly.
desc table_25930_b;
DROP TABLE table_25930_a;
DROP TABLE table_25930_b;
SET @@sql_mode=@save_sql_mode; SET @@sql_mode=@save_sql_mode;
#============================================================================= #=============================================================================

View File

@ -1249,13 +1249,40 @@ connection default;
disconnect user1; disconnect user1;
disconnect user2; disconnect user2;
disconnect user3; disconnect user3;
#
# Bug #30269 Query cache eats memory
#
--disable_warnings
DROP DATABASE IF EXISTS bug30269;
--enable_warnings
CREATE DATABASE bug30269;
USE bug30269;
CREATE TABLE test1 (id int, name varchar(23));
CREATE VIEW view1 AS SELECT id FROM test1;
INSERT INTO test1 VALUES (5, 'testit');
GRANT SELECT (id) ON TABLE bug30269.test1 TO 'bug30269'@'localhost';
GRANT SELECT ON TABLE bug30269.view1 TO 'bug30269'@'localhost';
set global query_cache_size= 81920;
connect (bug30269, localhost, bug30269,,);
connection bug30269;
USE bug30269;
show status like 'Qcache_queries_in_cache';
SELECT id FROM test1 WHERE id>2;
SELECT id FROM view1 WHERE id>2;
show status like 'Qcache_queries_in_cache';
connection default;
DROP DATABASE bug30269;
disconnect bug30269;
DROP USER 'bug30269'@'localhost';
set GLOBAL query_cache_type=default; set GLOBAL query_cache_type=default;
set GLOBAL query_cache_limit=default; set GLOBAL query_cache_limit=default;
set GLOBAL query_cache_min_res_unit=default; set GLOBAL query_cache_min_res_unit=default;
set GLOBAL query_cache_size=default; set GLOBAL query_cache_size=default;
--echo End of 5.0 tests --echo End of 5.0 tests
# #
# Bug #28211 RENAME DATABASE and query cache don't play nicely together # Bug #28211 RENAME DATABASE and query cache don't play nicely together
# #

View File

@ -77,7 +77,7 @@ int main(int argc, char **argv) {
_print_csinfo(cs); _print_csinfo(cs);
fflush(stdout); fflush(stdout);
#define NOT_USED_ANYMORE #ifdef NOT_USED_ANYMORE
cs_list = list_charsets(MYF(MY_CS_COMPILED | MY_CS_CONFIG)); cs_list = list_charsets(MYF(MY_CS_COMPILED | MY_CS_CONFIG));
printf("LIST OF CHARSETS (compiled + *.conf):\n%s\n", cs_list); printf("LIST OF CHARSETS (compiled + *.conf):\n%s\n", cs_list);
my_free(cs_list,MYF(0)); my_free(cs_list,MYF(0));

View File

@ -20,6 +20,10 @@
#include "event_db_repository.h" #include "event_db_repository.h"
#include "sp_head.h" #include "sp_head.h"
/**
@addtogroup Event_Scheduler
@{
*/
#define EVEX_MAX_INTERVAL_VALUE 1000000000L #define EVEX_MAX_INTERVAL_VALUE 1000000000L
@ -2082,3 +2086,7 @@ event_basic_identifier_equal(LEX_STRING db, LEX_STRING name, Event_basic *b)
return !sortcmp_lex_string(name, b->name, system_charset_info) && return !sortcmp_lex_string(name, b->name, system_charset_info) &&
!sortcmp_lex_string(db, b->dbname, system_charset_info); !sortcmp_lex_string(db, b->dbname, system_charset_info);
} }
/**
@} (End of group Event_Scheduler)
*/

View File

@ -15,6 +15,12 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/**
@addtogroup Event_Scheduler
@{
@file event_data_objects.h
*/
#define EVEX_GET_FIELD_FAILED -2 #define EVEX_GET_FIELD_FAILED -2
#define EVEX_BAD_PARAMS -5 #define EVEX_BAD_PARAMS -5
@ -280,5 +286,8 @@ event_basic_db_equal(LEX_STRING db, Event_basic *et);
bool bool
event_basic_identifier_equal(LEX_STRING db, LEX_STRING name, Event_basic *b); event_basic_identifier_equal(LEX_STRING db, LEX_STRING name, Event_basic *b);
/**
@} (End of group Event_Scheduler)
*/
#endif /* _EVENT_DATA_OBJECTS_H_ */ #endif /* _EVENT_DATA_OBJECTS_H_ */

View File

@ -20,6 +20,11 @@
#include "events.h" #include "events.h"
#include "sql_show.h" #include "sql_show.h"
/**
@addtogroup Event_Scheduler
@{
*/
static static
const TABLE_FIELD_W_TYPE event_table_fields[ET_FIELD_COUNT] = const TABLE_FIELD_W_TYPE event_table_fields[ET_FIELD_COUNT] =
{ {
@ -556,7 +561,7 @@ Event_db_repository::open_event_table(THD *thd, enum thr_lock_type lock_type,
only creates a record on disk. only creates a record on disk.
@pre The thread handle has no open tables. @pre The thread handle has no open tables.
@param[in,out] THD @param[in,out] thd THD
@param[in] parse_data Parsed event definition @param[in] parse_data Parsed event definition
@param[in] create_if_not TRUE if IF NOT EXISTS clause was provided @param[in] create_if_not TRUE if IF NOT EXISTS clause was provided
to CREATE EVENT statement to CREATE EVENT statement
@ -657,7 +662,7 @@ end:
@param[in,out] thd thread handle @param[in,out] thd thread handle
@param[in] parse_data parsed event definition @param[in] parse_data parsed event definition
@paran[in[ new_dbname not NULL if ALTER EVENT RENAME @param[in] new_dbname not NULL if ALTER EVENT RENAME
points at a new database name points at a new database name
@param[in] new_name not NULL if ALTER EVENT RENAME @param[in] new_name not NULL if ALTER EVENT RENAME
points at a new event name points at a new event name
@ -812,7 +817,7 @@ end:
@retval FALSE an event with such db/name key exists @retval FALSE an event with such db/name key exists
@reval TRUE no record found or an error occured. @retval TRUE no record found or an error occured.
*/ */
bool bool
@ -1112,3 +1117,7 @@ Event_db_repository::check_system_tables(THD *thd)
DBUG_RETURN(test(ret)); DBUG_RETURN(test(ret));
} }
/**
@} (End of group Event_Scheduler)
*/

View File

@ -15,8 +15,14 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/* /**
@file @addtogroup Event_Scheduler
@{
@file event_db_repository.h
Data Dictionary related operations of Event Scheduler.
This is a private header file of Events module. Please do not include it This is a private header file of Events module. Please do not include it
directly. All public declarations of Events module should be stored in directly. All public declarations of Events module should be stored in
events.h and event_data_objects.h. events.h and event_data_objects.h.
@ -119,4 +125,7 @@ private:
void operator=(Event_db_repository &); void operator=(Event_db_repository &);
}; };
/**
@} (End of group Event_Scheduler)
*/
#endif /* _EVENT_DB_REPOSITORY_H_ */ #endif /* _EVENT_DB_REPOSITORY_H_ */

View File

@ -17,6 +17,10 @@
#include "event_queue.h" #include "event_queue.h"
#include "event_data_objects.h" #include "event_data_objects.h"
/**
@addtogroup Event_Scheduler
@{
*/
#define EVENT_QUEUE_INITIAL_SIZE 30 #define EVENT_QUEUE_INITIAL_SIZE 30
#define EVENT_QUEUE_EXTENT 30 #define EVENT_QUEUE_EXTENT 30
@ -749,3 +753,7 @@ Event_queue::dump_internal_status()
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
/**
@} (End of group Event_Scheduler)
*/

View File

@ -15,12 +15,26 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/**
@addtogroup Event_Scheduler
@{
@file event_queue.h
Queue of events awaiting execution.
*/
class Event_basic; class Event_basic;
class Event_queue_element; class Event_queue_element;
class Event_queue_element_for_exec; class Event_queue_element_for_exec;
class THD; class THD;
/**
Queue of active events awaiting execution.
*/
class Event_queue class Event_queue
{ {
public: public:
@ -105,5 +119,8 @@ private:
bool mutex_queue_data_attempting_lock; bool mutex_queue_data_attempting_lock;
bool waiting_on_cond; bool waiting_on_cond;
}; };
/**
@} (End of group Event_Scheduler)
*/
#endif /* _EVENT_QUEUE_H_ */ #endif /* _EVENT_QUEUE_H_ */

View File

@ -20,6 +20,11 @@
#include "event_queue.h" #include "event_queue.h"
#include "event_db_repository.h" #include "event_db_repository.h"
/**
@addtogroup Event_Scheduler
@{
*/
#ifdef __GNUC__ #ifdef __GNUC__
#if __GNUC__ >= 2 #if __GNUC__ >= 2
#define SCHED_FUNC __FUNCTION__ #define SCHED_FUNC __FUNCTION__
@ -790,3 +795,7 @@ Event_scheduler::dump_internal_status()
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
/**
@} (End of group Event_Scheduler)
*/

View File

@ -15,11 +15,19 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/**
@addtogroup Event_Scheduler
@{
*/
/** /**
@file @file
This file is internal to Events module. Please do not include it directly.
All public declarations of Events module are in events.h and Declarations of the scheduler thread class
event_data_objects.h. and related functionality.
This file is internal to Event_Scheduler module. Please do not
include it directly. All public declarations of Event_Scheduler
module are in events.h and event_data_objects.h.
*/ */
@ -140,4 +148,8 @@ private:
void operator=(Event_scheduler &); void operator=(Event_scheduler &);
}; };
/**
@} (End of group Event_Scheduler)
*/
#endif /* _EVENT_SCHEDULER_H_ */ #endif /* _EVENT_SCHEDULER_H_ */

View File

@ -21,6 +21,11 @@
#include "event_scheduler.h" #include "event_scheduler.h"
#include "sp_head.h" // for Stored_program_creation_ctx #include "sp_head.h" // for Stored_program_creation_ctx
/**
@addtogroup Event_Scheduler
@{
*/
/* /*
TODO list : TODO list :
- CREATE EVENT should not go into binary log! Does it now? The SQL statements - CREATE EVENT should not go into binary log! Does it now? The SQL statements
@ -790,8 +795,7 @@ Events::show_create_event(THD *thd, LEX_STRING dbname, LEX_STRING name)
Check access rights and fill INFORMATION_SCHEMA.events table. Check access rights and fill INFORMATION_SCHEMA.events table.
@param[in,out] thd Thread context @param[in,out] thd Thread context
@param[in] table The temporary table to fill. @param[in] tables The temporary table to fill.
cond Unused
In MySQL INFORMATION_SCHEMA tables are temporary tables that are In MySQL INFORMATION_SCHEMA tables are temporary tables that are
created and filled on demand. In this function, we fill created and filled on demand. In this function, we fill
@ -1187,3 +1191,7 @@ end:
DBUG_RETURN(ret); DBUG_RETURN(ret);
} }
/**
@} (End of group Event_Scheduler)
*/

View File

@ -15,9 +15,14 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/* /**
@file @defgroup Event_Scheduler Event Scheduler
A public interface of Events Scheduler module. @ingroup Runtime_Environment
@{
@file events.h
A public interface of Events_Scheduler module.
*/ */
class Event_parse_data; class Event_parse_data;
@ -42,7 +47,7 @@ int
sortcmp_lex_string(LEX_STRING s, LEX_STRING t, CHARSET_INFO *cs); sortcmp_lex_string(LEX_STRING s, LEX_STRING t, CHARSET_INFO *cs);
/** /**
@class Events -- a facade to the functionality of the Event Scheduler. @brief A facade to the functionality of the Event Scheduler.
Every public operation against the scheduler has to be executed via the Every public operation against the scheduler has to be executed via the
interface provided by a static method of this class. No instance of this interface provided by a static method of this class. No instance of this
@ -152,5 +157,8 @@ private:
void operator=(Events &); void operator=(Events &);
}; };
/**
@} (end of group Event Scheduler)
*/
#endif /* _EVENT_H_ */ #endif /* _EVENT_H_ */

View File

@ -7824,7 +7824,7 @@ uchar *Field_blob::pack(uchar *to, const uchar *from, uint max_length)
@param to Destination of the data @param to Destination of the data
@param from Source of the data @param from Source of the data
@param param_data <not used> @param param_data not used
@return New pointer into memory based on from + length of the data @return New pointer into memory based on from + length of the data
*/ */

View File

@ -1803,7 +1803,12 @@ class Send_field {
*/ */
class Copy_field :public Sql_alloc { class Copy_field :public Sql_alloc {
void (*get_copy_func(Field *to,Field *from))(Copy_field *); /**
Convenience definition of a copy function returned by
get_copy_func.
*/
typedef void Copy_func(Copy_field*);
Copy_func *get_copy_func(Field *to, Field *from);
public: public:
uchar *from_ptr,*to_ptr; uchar *from_ptr,*to_ptr;
uchar *from_null_ptr,*to_null_ptr; uchar *from_null_ptr,*to_null_ptr;

View File

@ -620,7 +620,8 @@ void Copy_field::set(Field *to,Field *from,bool save)
} }
void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*) Copy_field::Copy_func *
Copy_field::get_copy_func(Field *to,Field *from)
{ {
bool compatible_db_low_byte_first= (to->table->s->db_low_byte_first == bool compatible_db_low_byte_first= (to->table->s->db_low_byte_first ==
from->table->s->db_low_byte_first); from->table->s->db_low_byte_first);

View File

@ -2398,7 +2398,7 @@ default_set_param_func(Item_param *param,
} }
Item_param::Item_param(unsigned pos_in_query_arg) : Item_param::Item_param(uint pos_in_query_arg) :
strict_type(FALSE), strict_type(FALSE),
state(NO_VALUE), state(NO_VALUE),
item_result_type(STRING_RESULT), item_result_type(STRING_RESULT),

File diff suppressed because it is too large Load Diff

View File

@ -53,7 +53,7 @@ public:
@param item_list The list of arguments to the function, can be NULL @param item_list The list of arguments to the function, can be NULL
@return An item representing the parsed function call, or NULL @return An item representing the parsed function call, or NULL
*/ */
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list) = 0; virtual Item *create(THD *thd, LEX_STRING name, List<Item> *item_list) = 0;
protected: protected:
/** Constructor */ /** Constructor */
@ -80,7 +80,7 @@ public:
@param item_list The list of arguments to the function, can be NULL @param item_list The list of arguments to the function, can be NULL
@return An item representing the parsed function call @return An item representing the parsed function call
*/ */
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list); virtual Item *create(THD *thd, LEX_STRING name, List<Item> *item_list);
/** /**
The builder create method, for qualified functions. The builder create method, for qualified functions.
@ -127,7 +127,7 @@ extern Create_qfunc * find_qualified_function_builder(THD *thd);
class Create_udf_func : public Create_func class Create_udf_func : public Create_func
{ {
public: public:
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list); virtual Item *create(THD *thd, LEX_STRING name, List<Item> *item_list);
/** /**
The builder create method, for User Defined Functions. The builder create method, for User Defined Functions.
@ -136,7 +136,7 @@ public:
@param item_list The list of arguments to the function, can be NULL @param item_list The list of arguments to the function, can be NULL
@return An item representing the parsed function call @return An item representing the parsed function call
*/ */
Item* create(THD *thd, udf_func *fct, List<Item> *item_list); Item *create(THD *thd, udf_func *fct, List<Item> *item_list);
/** Singleton. */ /** Singleton. */
static Create_udf_func s_singleton; static Create_udf_func s_singleton;

View File

@ -624,7 +624,7 @@ void Item_exists_subselect::print(String *str)
} }
bool Item_in_subselect::test_limit(SELECT_LEX_UNIT *unit_arg) bool Item_in_subselect::test_limit(st_select_lex_unit *unit_arg)
{ {
if (unit_arg->fake_select_lex && if (unit_arg->fake_select_lex &&
unit_arg->fake_select_lex->test_limit()) unit_arg->fake_select_lex->test_limit())

View File

@ -74,6 +74,11 @@ TODO:
#include <hash.h> #include <hash.h>
#include <assert.h> #include <assert.h>
/**
@defgroup Locking Locking
@{
*/
extern HASH open_cache; extern HASH open_cache;
/* flags for get_lock_data */ /* flags for get_lock_data */
@ -472,6 +477,9 @@ void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock)
unlock_external() we call handler::external_lock(F_UNLCK) only unlock_external() we call handler::external_lock(F_UNLCK) only
if table->current_lock is not F_UNLCK. if table->current_lock is not F_UNLCK.
@param thd thread context
@param locked list of locked tables
@param table the table to unlock
@param always_unlock specify explicitly if the legacy side @param always_unlock specify explicitly if the legacy side
effect is desired. effect is desired.
*/ */
@ -849,6 +857,7 @@ static MYSQL_LOCK *get_lock_data(THD *thd, TABLE **table_ptr, uint count,
if ((table=table_ptr[i])->s->tmp_table == NON_TRANSACTIONAL_TMP_TABLE) if ((table=table_ptr[i])->s->tmp_table == NON_TRANSACTIONAL_TMP_TABLE)
continue; continue;
lock_type= table->reginfo.lock_type; lock_type= table->reginfo.lock_type;
DBUG_ASSERT (lock_type != TL_WRITE_DEFAULT);
if (lock_type >= TL_WRITE_ALLOW_WRITE) if (lock_type >= TL_WRITE_ALLOW_WRITE)
{ {
*write_lock_used=table; *write_lock_used=table;
@ -1174,8 +1183,9 @@ bool lock_table_names_exclusively(THD *thd, TABLE_LIST *table_list)
/** /**
@brief Test is 'table' is protected by an exclusive name lock. @brief Test is 'table' is protected by an exclusive name lock.
@param[in] thd The current thread handler @param[in] thd The current thread handler
@param[in] table Table container containing the single table to be tested @param[in] table_list Table container containing the single table to be
tested
@note Needs to be protected by LOCK_open mutex. @note Needs to be protected by LOCK_open mutex.
@ -1201,8 +1211,9 @@ is_table_name_exclusively_locked_by_this_thread(THD *thd,
/** /**
@brief Test is 'table key' is protected by an exclusive name lock. @brief Test is 'table key' is protected by an exclusive name lock.
@param[in] thd The current thread handler. @param[in] thd The current thread handler.
@param[in] table Table container containing the single table to be tested. @param[in] key
@param[in] key_length
@note Needs to be protected by LOCK_open mutex @note Needs to be protected by LOCK_open mutex
@ -1585,4 +1596,6 @@ void broadcast_refresh(void)
VOID(pthread_cond_broadcast(&COND_global_read_lock)); VOID(pthread_cond_broadcast(&COND_global_read_lock));
} }
/**
@} (end of group Locking)
*/

View File

@ -13,6 +13,15 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/**
@addtogroup Replication
@{
@file
Binary log event definitions.
*/
#ifndef _log_event_h #ifndef _log_event_h
#define _log_event_h #define _log_event_h
@ -2546,7 +2555,7 @@ protected:
<caption>Incident event format</caption> <caption>Incident event format</caption>
<tr> <tr>
<th>Symbol</th> <th>Symbol</th>
<th>Size<br/>(bytes)</th> <th>Size<br>(bytes)</th>
<th>Description</th> <th>Description</th>
</tr> </tr>
<tr> <tr>
@ -2631,4 +2640,8 @@ static inline bool copy_event_cache_to_file_and_reinit(IO_CACHE *cache,
reinit_io_cache(cache, WRITE_CACHE, 0, FALSE, TRUE); reinit_io_cache(cache, WRITE_CACHE, 0, FALSE, TRUE);
} }
/**
@} (end of group Replication)
*/
#endif /* _log_event_h */ #endif /* _log_event_h */

View File

@ -177,6 +177,7 @@ pack_row(TABLE *table, MY_BITMAP const* cols,
record on the master side record on the master side
@param rw_set Pointer to bitmap that holds either the read_set or the @param rw_set Pointer to bitmap that holds either the read_set or the
write_set of the table write_set of the table
@param event_type
@retval 0 No error @retval 0 No error

View File

@ -16,6 +16,12 @@
#ifndef SLAVE_H #ifndef SLAVE_H
#define SLAVE_H #define SLAVE_H
/**
@defgroup Replication Replication
@{
@file
*/
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
#include "log.h" #include "log.h"
@ -213,6 +219,8 @@ extern I_List<THD> threads;
#define SLAVE_IO 1 #define SLAVE_IO 1
#define SLAVE_SQL 2 #define SLAVE_SQL 2
/**
@} (end of group Replication)
*/
#endif #endif

View File

@ -84,7 +84,7 @@ class Stored_routine_creation_ctx : public Stored_program_creation_ctx,
{ {
public: public:
static Stored_routine_creation_ctx * static Stored_routine_creation_ctx *
load_from_db(THD *thd, const class sp_name *name, TABLE *proc_tbl); load_from_db(THD *thd, const sp_name *name, TABLE *proc_tbl);
public: public:
virtual Stored_program_creation_ctx *clone(MEM_ROOT *mem_root) virtual Stored_program_creation_ctx *clone(MEM_ROOT *mem_root)

View File

@ -23,6 +23,11 @@
#include <stddef.h> #include <stddef.h>
/**
@defgroup Stored_Routines Stored Routines
@ingroup Runtime_Environment
@{
*/
// Values for the type enum. This reflects the order of the enum declaration // Values for the type enum. This reflects the order of the enum declaration
// in the CREATE TABLE command. // in the CREATE TABLE command.
#define TYPE_ENUM_FUNCTION 1 #define TYPE_ENUM_FUNCTION 1
@ -186,7 +191,7 @@ public:
LEX_STRING m_qname; // db.name LEX_STRING m_qname; // db.name
/** /**
Key representing routine in the set of stored routines used by statement. Key representing routine in the set of stored routines used by statement.
[routine_type]db.name\0 [routine_type]db.name
@sa sp_name::m_sroutines_key @sa sp_name::m_sroutines_key
*/ */
LEX_STRING m_sroutines_key; LEX_STRING m_sroutines_key;
@ -1322,4 +1327,8 @@ sp_prepare_func_item(THD* thd, Item **it_addr);
bool bool
sp_eval_expr(THD *thd, Field *result_field, Item **expr_item_ptr); sp_eval_expr(THD *thd, Field *result_field, Item **expr_item_ptr);
/**
@} (end of group Stored_Routines)
*/
#endif /* _SP_HEAD_H_ */ #endif /* _SP_HEAD_H_ */

View File

@ -668,7 +668,7 @@ void field_ulonglong::add()
} // field_ulonglong::add } // field_ulonglong::add
int analyse::send_row(List<Item> &field_list __attribute__((unused))) int analyse::send_row(List<Item> & /* field_list */)
{ {
field_info **f = f_info; field_info **f = f_info;

View File

@ -348,7 +348,7 @@ public:
} }
virtual void add() {} virtual void add() {}
virtual bool change_columns(List<Item> &fields); virtual bool change_columns(List<Item> &fields);
virtual int send_row(List<Item> &fields); virtual int send_row(List<Item> &field_list);
virtual void end_group(void) {} virtual void end_group(void) {}
virtual bool end_of_records(void); virtual bool end_of_records(void);
friend Procedure *proc_analyse_init(THD *thd, ORDER *param, friend Procedure *proc_analyse_init(THD *thd, ORDER *param,

View File

@ -82,6 +82,10 @@ bool Prelock_error_handler::safely_trapped_errors()
return ((m_handled_errors > 0) && (m_unhandled_errors == 0)); return ((m_handled_errors > 0) && (m_unhandled_errors == 0));
} }
/**
@defgroup Data_Dictionary Data Dictionary
@{
*/
TABLE *unused_tables; /* Used by mysql_test */ TABLE *unused_tables; /* Used by mysql_test */
HASH open_cache; /* Used by mysql_test */ HASH open_cache; /* Used by mysql_test */
@ -2141,9 +2145,9 @@ bool lock_table_name_if_not_cached(THD *thd, const char *db,
@brief Check that table exists in table definition cache, on disk @brief Check that table exists in table definition cache, on disk
or in some storage engine. or in some storage engine.
@param thd Thread context @param thd Thread context
@param table Table list element @param table Table list element
@param exists[out] Out parameter which is set to TRUE if table @param[out] exists Out parameter which is set to TRUE if table
exists and to FALSE otherwise. exists and to FALSE otherwise.
@note This function assumes that caller owns LOCK_open mutex. @note This function assumes that caller owns LOCK_open mutex.
@ -2244,7 +2248,6 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
HASH_SEARCH_STATE state; HASH_SEARCH_STATE state;
DBUG_ENTER("open_table"); DBUG_ENTER("open_table");
DBUG_ASSERT (table_list->lock_type != TL_WRITE_DEFAULT);
/* find a unused table in the open table cache */ /* find a unused table in the open table cache */
if (refresh) if (refresh)
*refresh=0; *refresh=0;
@ -3548,11 +3551,6 @@ int open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags)
{ {
safe_to_ignore_table= FALSE; safe_to_ignore_table= FALSE;
if (tables->lock_type == TL_WRITE_DEFAULT)
{
tables->lock_type= thd->update_lock_default;
DBUG_ASSERT (tables->lock_type >= TL_WRITE_ALLOW_WRITE);
}
/* /*
Ignore placeholders for derived tables. After derived tables Ignore placeholders for derived tables. After derived tables
processing, link to created temporary table will be put here. processing, link to created temporary table will be put here.
@ -3697,7 +3695,8 @@ int open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags)
} }
if (tables->lock_type != TL_UNLOCK && ! thd->locked_tables) if (tables->lock_type != TL_UNLOCK && ! thd->locked_tables)
tables->table->reginfo.lock_type=tables->lock_type; tables->table->reginfo.lock_type= tables->lock_type == TL_WRITE_DEFAULT ?
thd->update_lock_default : tables->lock_type;
tables->table->grant= tables->grant; tables->table->grant= tables->grant;
process_view_routines: process_view_routines:
@ -7795,3 +7794,6 @@ void close_performance_schema_table(THD *thd, Open_tables_state *backup)
thd->restore_backup_open_tables_state(backup); thd->restore_backup_open_tables_state(backup);
} }
/**
@} (end of group Data_Dictionary)
*/

View File

@ -3222,14 +3222,31 @@ void Query_cache::double_linked_list_join(Query_cache_block *head_tail,
>0 number of tables >0 number of tables
*/ */
static TABLE_COUNTER_TYPE process_and_count_tables(TABLE_LIST *tables_used, TABLE_COUNTER_TYPE
uint8 *tables_type) Query_cache::process_and_count_tables(THD *thd, TABLE_LIST *tables_used,
uint8 *tables_type)
{ {
DBUG_ENTER("process_and_count_tables"); DBUG_ENTER("process_and_count_tables");
TABLE_COUNTER_TYPE table_count = 0; TABLE_COUNTER_TYPE table_count = 0;
for (; tables_used; tables_used= tables_used->next_global) for (; tables_used; tables_used= tables_used->next_global)
{ {
table_count++; table_count++;
#ifdef HAVE_QUERY_CACHE
/*
Disable any attempt to store this statement if there are
column level grants on any referenced tables.
The grant.want_privileges flag was set to 1 in the
check_grant() function earlier if the TABLE_LIST object
had any associated column privileges.
*/
if (tables_used->grant.want_privilege)
{
DBUG_PRINT("qcache", ("Don't cache statement as it refers to "
"tables with column privileges."));
thd->lex->safe_to_cache_query= 0;
DBUG_RETURN(0);
}
#endif
if (tables_used->view) if (tables_used->view)
{ {
DBUG_PRINT("qcache", ("view: %s db: %s", DBUG_PRINT("qcache", ("view: %s db: %s",
@ -3307,7 +3324,8 @@ Query_cache::is_cacheable(THD *thd, uint32 query_len, char *query, LEX *lex,
(long) lex->select_lex.options, (long) lex->select_lex.options,
(int) thd->variables.query_cache_type)); (int) thd->variables.query_cache_type));
if (!(table_count= process_and_count_tables(tables_used, tables_type))) if (!(table_count= process_and_count_tables(thd, tables_used,
tables_type)))
DBUG_RETURN(0); DBUG_RETURN(0);
if ((thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) && if ((thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) &&

View File

@ -409,10 +409,12 @@ protected:
If query is cacheable return number tables in query If query is cacheable return number tables in query
(query without tables not cached) (query without tables not cached)
*/ */
static
TABLE_COUNTER_TYPE is_cacheable(THD *thd, uint32 query_len, char *query, TABLE_COUNTER_TYPE is_cacheable(THD *thd, uint32 query_len, char *query,
LEX *lex, TABLE_LIST *tables_used, LEX *lex, TABLE_LIST *tables_used,
uint8 *tables_type); uint8 *tables_type);
TABLE_COUNTER_TYPE process_and_count_tables(THD *thd,
TABLE_LIST *tables_used,
uint8 *tables_type);
static my_bool ask_handler_allowance(THD *thd, TABLE_LIST *tables_used); static my_bool ask_handler_allowance(THD *thd, TABLE_LIST *tables_used);
public: public:

View File

@ -2423,6 +2423,10 @@ bool Security_context::set_user(char *user_arg)
Initialize this security context from the passed in credentials Initialize this security context from the passed in credentials
and activate it in the current thread. and activate it in the current thread.
@param thd
@param definer_user
@param definer_host
@param db
@param[out] backup Save a pointer to the current security context @param[out] backup Save a pointer to the current security context
in the thread. In case of success it points to the in the thread. In case of success it points to the
saved old context, otherwise it points to NULL. saved old context, otherwise it points to NULL.

View File

@ -1350,7 +1350,7 @@ static void mysql_change_db_impl(THD *thd,
@brief Change the current database. @brief Change the current database.
@param thd thread handle @param thd thread handle
@param name database name @param new_db_name database name
@param force_switch if this flag is set (TRUE), mysql_change_db() will @param force_switch if this flag is set (TRUE), mysql_change_db() will
switch to NULL db if the specified database is not switch to NULL db if the specified database is not
available anymore. Corresponding warning will be available anymore. Corresponding warning will be

View File

@ -119,6 +119,44 @@ static void mysql_ha_hash_free(TABLE_LIST *tables)
my_free((char*) tables, MYF(0)); my_free((char*) tables, MYF(0));
} }
/**
Close a HANDLER table.
@param thd Thread identifier.
@param tables A list of tables with the first entry to close.
@note Though this function takes a list of tables, only the first list entry
will be closed.
@note Broadcasts refresh if it closed the table.
*/
static void mysql_ha_close_table(THD *thd, TABLE_LIST *tables)
{
TABLE **table_ptr;
/*
Though we could take the table pointer from hash_tables->table,
we must follow the thd->handler_tables chain anyway, as we need the
address of the 'next' pointer referencing this table
for close_thread_table().
*/
for (table_ptr= &(thd->handler_tables);
*table_ptr && (*table_ptr != tables->table);
table_ptr= &(*table_ptr)->next)
;
if (*table_ptr)
{
(*table_ptr)->file->ha_index_or_rnd_end();
VOID(pthread_mutex_lock(&LOCK_open));
if (close_thread_table(thd, table_ptr))
{
/* Tell threads waiting for refresh that something has happened */
broadcast_refresh();
}
VOID(pthread_mutex_unlock(&LOCK_open));
}
}
/* /*
Open a HANDLER table. Open a HANDLER table.
@ -145,7 +183,7 @@ static void mysql_ha_hash_free(TABLE_LIST *tables)
bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen) bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
{ {
TABLE_LIST *hash_tables; TABLE_LIST *hash_tables = NULL;
char *db, *name, *alias; char *db, *name, *alias;
uint dblen, namelen, aliaslen, counter; uint dblen, namelen, aliaslen, counter;
int error; int error;
@ -197,7 +235,6 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
{ {
if (! reopen) if (! reopen)
my_error(ER_ILLEGAL_HA, MYF(0), tables->alias); my_error(ER_ILLEGAL_HA, MYF(0), tables->alias);
mysql_ha_close(thd, tables);
goto err; goto err;
} }
@ -225,11 +262,7 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
/* add to hash */ /* add to hash */
if (my_hash_insert(&thd->handler_tables_hash, (uchar*) hash_tables)) if (my_hash_insert(&thd->handler_tables_hash, (uchar*) hash_tables))
{
my_free((char*) hash_tables, MYF(0));
mysql_ha_close(thd, tables);
goto err; goto err;
}
} }
if (! reopen) if (! reopen)
@ -238,13 +271,17 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
err: err:
if (hash_tables)
my_free((char*) hash_tables, MYF(0));
if (tables->table)
mysql_ha_close_table(thd, tables);
DBUG_PRINT("exit",("ERROR")); DBUG_PRINT("exit",("ERROR"));
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
/* /*
Close a HANDLER table. Close a HANDLER table by alias or table name
SYNOPSIS SYNOPSIS
mysql_ha_close() mysql_ha_close()
@ -252,9 +289,8 @@ err:
tables A list of tables with the first entry to close. tables A list of tables with the first entry to close.
DESCRIPTION DESCRIPTION
Though this function takes a list of tables, only the first list entry Closes the table that is associated (on the handler tables hash) with the
will be closed. name (table->alias) of the specified table.
Broadcasts refresh if it closed the table.
RETURN RETURN
FALSE ok FALSE ok
@ -264,7 +300,6 @@ err:
bool mysql_ha_close(THD *thd, TABLE_LIST *tables) bool mysql_ha_close(THD *thd, TABLE_LIST *tables)
{ {
TABLE_LIST *hash_tables; TABLE_LIST *hash_tables;
TABLE **table_ptr;
DBUG_ENTER("mysql_ha_close"); DBUG_ENTER("mysql_ha_close");
DBUG_PRINT("enter",("'%s'.'%s' as '%s'", DBUG_PRINT("enter",("'%s'.'%s' as '%s'",
tables->db, tables->table_name, tables->alias)); tables->db, tables->table_name, tables->alias));
@ -273,28 +308,7 @@ bool mysql_ha_close(THD *thd, TABLE_LIST *tables)
(uchar*) tables->alias, (uchar*) tables->alias,
strlen(tables->alias) + 1))) strlen(tables->alias) + 1)))
{ {
/* mysql_ha_close_table(thd, hash_tables);
Though we could take the table pointer from hash_tables->table,
we must follow the thd->handler_tables chain anyway, as we need the
address of the 'next' pointer referencing this table
for close_thread_table().
*/
for (table_ptr= &(thd->handler_tables);
*table_ptr && (*table_ptr != hash_tables->table);
table_ptr= &(*table_ptr)->next)
;
if (*table_ptr)
{
(*table_ptr)->file->ha_index_or_rnd_end();
VOID(pthread_mutex_lock(&LOCK_open));
if (close_thread_table(thd, table_ptr))
{
/* Tell threads waiting for refresh that something has happened */
broadcast_refresh();
}
VOID(pthread_mutex_unlock(&LOCK_open));
}
hash_delete(&thd->handler_tables_hash, (uchar*) hash_tables); hash_delete(&thd->handler_tables_hash, (uchar*) hash_tables);
} }
else else

View File

@ -173,7 +173,7 @@ void Lex_input_stream::body_utf8_start(THD *thd, const char *begin_ptr)
} }
/** /**
The operation appends unprocessed part of pre-processed buffer till @brief The operation appends unprocessed part of pre-processed buffer till
the given pointer (ptr) and sets m_cpp_utf8_processed_ptr to end_ptr. the given pointer (ptr) and sets m_cpp_utf8_processed_ptr to end_ptr.
The idea is that some tokens in the pre-processed buffer (like character The idea is that some tokens in the pre-processed buffer (like character
@ -1400,6 +1400,19 @@ int MYSQLlex(void *arg, void *yythd)
} }
/**
Construct a copy of this object to be used for mysql_alter_table
and mysql_create_table.
Historically, these two functions modify their Alter_info
arguments. This behaviour breaks re-execution of prepared
statements and stored procedures and is compensated by always
supplying a copy of Alter_info to these functions.
@return You need to use check the error in THD for out
of memory condition after calling this function.
*/
Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root) Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
:drop_list(rhs.drop_list, mem_root), :drop_list(rhs.drop_list, mem_root),
alter_list(rhs.alter_list, mem_root), alter_list(rhs.alter_list, mem_root),
@ -1737,7 +1750,7 @@ void st_select_lex_unit::exclude_tree()
'last' should be reachable from this st_select_lex_node 'last' should be reachable from this st_select_lex_node
*/ */
void st_select_lex::mark_as_dependent(SELECT_LEX *last) void st_select_lex::mark_as_dependent(st_select_lex *last)
{ {
/* /*
Mark all selects from resolved to 1 before select where was Mark all selects from resolved to 1 before select where was
@ -2355,7 +2368,7 @@ st_lex::copy_db_to(char **p_db, size_t *p_db_length) const
values - SELECT_LEX with initial values for counters values - SELECT_LEX with initial values for counters
*/ */
void st_select_lex_unit::set_limit(SELECT_LEX *sl) void st_select_lex_unit::set_limit(st_select_lex *sl)
{ {
ha_rows select_limit_val; ha_rows select_limit_val;
@ -2885,7 +2898,7 @@ bool st_select_lex::add_index_hint (THD *thd, char *str, uint length)
partitioning or if only partitions to add or to split. partitioning or if only partitions to add or to split.
@note This needs to be outside of WITH_PARTITION_STORAGE_ENGINE since it @note This needs to be outside of WITH_PARTITION_STORAGE_ENGINE since it
is used from the sql parser that doesn't have any #ifdef's is used from the sql parser that doesn't have any ifdef's
@retval TRUE Yes, it is part of a management partition command @retval TRUE Yes, it is part of a management partition command
@retval FALSE No, not a management partition command @retval FALSE No, not a management partition command

View File

@ -13,6 +13,9 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/**
@defgroup Semantic_Analysis Semantic Analysis
*/
/* YACC and LEX Definitions */ /* YACC and LEX Definitions */
@ -887,16 +890,6 @@ public:
datetime_field= 0; datetime_field= 0;
error_if_not_empty= FALSE; error_if_not_empty= FALSE;
} }
/**
Construct a copy of this object to be used for mysql_alter_table
and mysql_create_table. Historically, these two functions modify
their Alter_info arguments. This behaviour breaks re-execution of
prepared statements and stored procedures and is compensated by
always supplying a copy of Alter_info to these functions.
@return You need to use check the error in THD for out
of memory condition after calling this function.
*/
Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root); Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root);
private: private:
Alter_info &operator=(const Alter_info &rhs); // not implemented Alter_info &operator=(const Alter_info &rhs); // not implemented
@ -1102,8 +1095,9 @@ enum enum_comment_state
/** /**
This class represents the character input stream consumed during @brief This class represents the character input stream consumed during
lexical analysis. lexical analysis.
In addition to consuming the input stream, this class performs some In addition to consuming the input stream, this class performs some
comment pre processing, by filtering out out of bound special text comment pre processing, by filtering out out of bound special text
from the query input stream. from the query input stream.
@ -1113,6 +1107,7 @@ enum enum_comment_state
is the pre-processed buffer that contains only the query text that is the pre-processed buffer that contains only the query text that
should be seen once out-of-bound data is removed. should be seen once out-of-bound data is removed.
*/ */
class Lex_input_stream class Lex_input_stream
{ {
public: public:
@ -1121,6 +1116,7 @@ public:
/** /**
Set the echo mode. Set the echo mode.
When echo is true, characters parsed from the raw input stream are When echo is true, characters parsed from the raw input stream are
preserved. When false, characters parsed are silently ignored. preserved. When false, characters parsed are silently ignored.
@param echo the echo mode. @param echo the echo mode.
@ -1516,9 +1512,9 @@ typedef struct st_lex : public Query_tables_list
/** End of SELECT of CREATE VIEW statement */ /** End of SELECT of CREATE VIEW statement */
const char* create_view_select_end; const char* create_view_select_end;
/** Start of 'ON <table>', in trigger statements. */ /** Start of 'ON table', in trigger statements. */
const char* raw_trg_on_table_name_begin; const char* raw_trg_on_table_name_begin;
/** End of 'ON <table>', in trigger statements. */ /** End of 'ON table', in trigger statements. */
const char* raw_trg_on_table_name_end; const char* raw_trg_on_table_name_end;
/* Partition info structure filled in by PARTITION BY parse part */ /* Partition info structure filled in by PARTITION BY parse part */
@ -1830,4 +1826,8 @@ extern void trim_whitespace(CHARSET_INFO *cs, LEX_STRING *str);
extern bool is_lex_native_function(const LEX_STRING *name); extern bool is_lex_native_function(const LEX_STRING *name);
/**
@} (End of group Semantic_Analysis)
*/
#endif /* MYSQL_SERVER */ #endif /* MYSQL_SERVER */

View File

@ -28,6 +28,11 @@
#include "events.h" #include "events.h"
#include "sql_trigger.h" #include "sql_trigger.h"
/**
@defgroup Runtime_Environment Runtime Environment
@{
*/
/* Used in error handling only */ /* Used in error handling only */
#define SP_TYPE_STRING(LP) \ #define SP_TYPE_STRING(LP) \
((LP)->sphead->m_type == TYPE_ENUM_FUNCTION ? "FUNCTION" : "PROCEDURE") ((LP)->sphead->m_type == TYPE_ENUM_FUNCTION ? "FUNCTION" : "PROCEDURE")
@ -5375,11 +5380,12 @@ void mysql_init_multi_delete(LEX *lex)
/** /**
Parse a query. Parse a query.
@param thd Current thread
@param inBuf Begining of the query text @param thd Current thread
@param length Length of the query text @param inBuf Begining of the query text
@param [out] semicolon For multi queries, position of the character of @param length Length of the query text
the next query in the query text. @param[out] found_semicolon For multi queries, position of the character of
the next query in the query text.
*/ */
void mysql_parse(THD *thd, const char *inBuf, uint length, void mysql_parse(THD *thd, const char *inBuf, uint length,
@ -7246,3 +7252,7 @@ bool parse_sql(THD *thd,
return err_status; return err_status;
} }
/**
@} (end of group Runtime_Environment)
*/

View File

@ -2444,7 +2444,7 @@ void plugin_thdvar_cleanup(THD *thd)
/** /**
@brief Free values of thread variables of a plugin. @brief Free values of thread variables of a plugin.
@detail This must be called before a plugin is deleted. Otherwise its This must be called before a plugin is deleted. Otherwise its
variables are no longer accessible and the value space is lost. Note variables are no longer accessible and the value space is lost. Note
that only string values with PLUGIN_VAR_MEMALLOC are allocated and that only string values with PLUGIN_VAR_MEMALLOC are allocated and
must be freed. must be freed.

View File

@ -112,7 +112,6 @@ public:
/****************************************************************************/ /****************************************************************************/
/** /**
@class Prepared_statement
@brief Prepared_statement: a statement that can contain placeholders @brief Prepared_statement: a statement that can contain placeholders
*/ */

View File

@ -13,6 +13,10 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/**
@defgroup Query_Optimizer Query Optimizer
@{
*/
/* mysql_select and join optimization */ /* mysql_select and join optimization */
@ -16199,3 +16203,7 @@ bool JOIN::change_result(select_result *res)
} }
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }
/**
@} (end of group Query_Optimizer)
*/

View File

@ -2459,8 +2459,8 @@ static COND * make_cond_for_info_schema(COND *cond, TABLE_LIST *table)
@param[in] thd thread handler @param[in] thd thread handler
@param[in] cond WHERE condition @param[in] cond WHERE condition
@param[in] table I_S table @param[in] tables I_S table
@param[in, out] lookup_field_vals Struct which holds lookup values @param[in, out] lookup_field_values Struct which holds lookup values
@return void @return void
*/ */

View File

@ -1882,7 +1882,7 @@ end:
@param thd @param thd
@param event @param event
@param time_type, @param time_type
@param old_row_is_record1 @param old_row_is_record1
@return Error status. @return Error status.
@ -2074,9 +2074,9 @@ process_unknown_string(char *&unknown_key, uchar* base, MEM_ROOT *mem_root,
/** /**
Contruct path to TRN-file. Contruct path to TRN-file.
@param thd[in] Thread context. @param[in] thd Thread context.
@param trg_name[in] Trigger name. @param[in] trg_name Trigger name.
@param trn_path[out] Variable to store constructed path @param[out] trn_path Variable to store constructed path
*/ */
void build_trn_path(THD *thd, const sp_name *trg_name, LEX_STRING *trn_path) void build_trn_path(THD *thd, const sp_name *trg_name, LEX_STRING *trn_path)
@ -2109,10 +2109,10 @@ bool check_trn_exists(const LEX_STRING *trn_path)
/** /**
Retrieve table name for given trigger. Retrieve table name for given trigger.
@param thd[in] Thread context. @param[in] thd Thread context.
@param trg_name[in] Trigger name. @param[in] trg_name Trigger name.
@param trn_path[in] Path to the corresponding TRN-file. @param[in] trn_path Path to the corresponding TRN-file.
@param tbl_name[out] Variable to store retrieved table name. @param[out] tbl_name Variable to store retrieved table name.
@return Error status. @return Error status.
@retval FALSE on success. @retval FALSE on success.

View File

@ -86,10 +86,10 @@ static bool check_fields(THD *thd, List<Item> &items)
/** /**
@brief Re-read record if more columns are needed for error message. @brief Re-read record if more columns are needed for error message.
@detail If we got a duplicate key error, we want to write an error If we got a duplicate key error, we want to write an error
message containing the value of the duplicate key. If we do not have message containing the value of the duplicate key. If we do not have
all fields of the key value in record[0], we need to re-read the all fields of the key value in record[0], we need to re-read the
record with a proper read_set. record with a proper read_set.
@param[in] error error number @param[in] error error number
@param[in] table table @param[in] table table

File diff suppressed because it is too large Load Diff

View File

@ -157,7 +157,7 @@ enum enum_table_category
- FLUSH TABLES WITH READ LOCK - FLUSH TABLES WITH READ LOCK
- SET GLOBAL READ_ONLY = ON - SET GLOBAL READ_ONLY = ON
do not apply to this table. do not apply to this table.
Note that LOCK TABLE <t> FOR READ/WRITE Note that LOCK TABLE t FOR READ/WRITE
can be used on temporary tables. can be used on temporary tables.
Temporary tables are not part of the table cache. Temporary tables are not part of the table cache.
*/ */
@ -166,7 +166,7 @@ enum enum_table_category
/** /**
User table. User table.
These tables do honor: These tables do honor:
- LOCK TABLE <t> FOR READ/WRITE - LOCK TABLE t FOR READ/WRITE
- FLUSH TABLES WITH READ LOCK - FLUSH TABLES WITH READ LOCK
- SET GLOBAL READ_ONLY = ON - SET GLOBAL READ_ONLY = ON
User tables are cached in the table cache. User tables are cached in the table cache.
@ -176,7 +176,7 @@ enum enum_table_category
/** /**
System table, maintained by the server. System table, maintained by the server.
These tables do honor: These tables do honor:
- LOCK TABLE <t> FOR READ/WRITE - LOCK TABLE t FOR READ/WRITE
- FLUSH TABLES WITH READ LOCK - FLUSH TABLES WITH READ LOCK
- SET GLOBAL READ_ONLY = ON - SET GLOBAL READ_ONLY = ON
Typically, writes to system tables are performed by Typically, writes to system tables are performed by
@ -190,7 +190,7 @@ enum enum_table_category
These tables are an interface provided by the system These tables are an interface provided by the system
to inspect the system metadata. to inspect the system metadata.
These tables do *not* honor: These tables do *not* honor:
- LOCK TABLE <t> FOR READ/WRITE - LOCK TABLE t FOR READ/WRITE
- FLUSH TABLES WITH READ LOCK - FLUSH TABLES WITH READ LOCK
- SET GLOBAL READ_ONLY = ON - SET GLOBAL READ_ONLY = ON
as there is no point in locking explicitely as there is no point in locking explicitely
@ -212,7 +212,7 @@ enum enum_table_category
These tables are an interface provided by the system These tables are an interface provided by the system
to inspect the system performance data. to inspect the system performance data.
These tables do *not* honor: These tables do *not* honor:
- LOCK TABLE <t> FOR READ/WRITE - LOCK TABLE t FOR READ/WRITE
- FLUSH TABLES WITH READ LOCK - FLUSH TABLES WITH READ LOCK
- SET GLOBAL READ_ONLY = ON - SET GLOBAL READ_ONLY = ON
as there is no point in locking explicitely as there is no point in locking explicitely