From b3cc3d4a9d2a948eb9ae168a8200f51ae170b946 Mon Sep 17 00:00:00 2001 From: "malff/marcsql@weblab.(none)" <> Date: Thu, 9 Aug 2007 17:31:00 -0600 Subject: [PATCH 01/15] Bug#25930 (CREATE TABLE x SELECT ... parses columns wrong when ran with ANSI_QUOTES mode) This patch contains a test case only, showing that the bug has been fixed. The issue was related to parsing <"blah">, where the lexical analyser would not properly delimit the start and end of the token. Properly making the token boundaries has been fixed in sql_lex.cc with the patch for bug 25411 : see the Lex_input_stream class. --- mysql-test/r/parser.result | 10 ++++++++++ mysql-test/t/parser.test | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/mysql-test/r/parser.result b/mysql-test/r/parser.result index cb44a235f25..76326f65f08 100644 --- a/mysql-test/r/parser.result +++ b/mysql-test/r/parser.result @@ -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 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 +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; select pi(3.14); ERROR 42000: Incorrect parameter count in the call to native function 'pi' diff --git a/mysql-test/t/parser.test b/mysql-test/t/parser.test index 65aa9dbb89b..79c9129bb74 100644 --- a/mysql-test/t/parser.test +++ b/mysql-test/t/parser.test @@ -363,6 +363,28 @@ create table VAR_SAMP(a int); --error ER_PARSE_ERROR 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; #============================================================================= From 8f9168df53736adf17e3c9d33068c6486b861203 Mon Sep 17 00:00:00 2001 From: "kostja@bodhi.(none)" <> Date: Sat, 11 Aug 2007 01:11:56 +0400 Subject: [PATCH 02/15] A fix for Bug#30212 events_logs_tests not deterministic; SLEEP(2), others Make the test deterministic. --- mysql-test/r/events_logs_tests.result | 162 ++++++++++-------------- mysql-test/t/events_logs_tests.test | 176 +++++++++++--------------- 2 files changed, 140 insertions(+), 198 deletions(-) diff --git a/mysql-test/r/events_logs_tests.result b/mysql-test/r/events_logs_tests.result index b69a02c9819..fb658b4a83b 100644 --- a/mysql-test/r/events_logs_tests.result +++ b/mysql-test/r/events_logs_tests.result @@ -1,100 +1,70 @@ -CREATE DATABASE IF NOT EXISTS events_test; -USE events_test; -"We use procedure here because its statements won't be logged into the general log" -"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" -CREATE procedure select_general_log() -BEGIN -SELECT user_host, argument FROM mysql.general_log WHERE argument LIKE '%alabala%'; -END| -"Check General Query Log" -CALL select_general_log(); +drop database if exists events_test; +create database if not exists events_test; +use events_test; + +We use procedure here because its statements won't be +logged into the general log. 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 + +create procedure 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 CREATE procedure select_general_log() -BEGIN -SELECT user_host, argument FROM mysql.general_log WHERE argument LIKE '%alabala%'; -END -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; -"Wait the scheduler to start" -"Should see 2 rows - the 'SELECT' is in the middle. The other two are selects from general_log" -CALL select_general_log(); +USER_HOST select 'events_logs_tests' as outside_event + +Check that unlike sub-statements of stored procedures, +sub-statements of events are present in the general log. + +set global event_scheduler=on; +truncate mysql.general_log; +create event ev_log_general on schedule at now() on completion not preserve do select 'events_logs_test' as inside_event; +call select_general_log(); user_host argument -USER_HOST CREATE EVENT log_general ON SCHEDULE EVERY 1 MINUTE DO SELECT 'alabala', SLEEP(1) FROM DUAL -USER_HOST SELECT 'alabala', SLEEP(1) FROM DUAL -DROP PROCEDURE select_general_log; -DROP EVENT log_general; -SET GLOBAL event_scheduler=off; -"Check slow query log" -"Save the values" -SET @old_global_long_query_time:=(select get_value()); -SET @old_session_long_query_time:=@@long_query_time; -SHOW VARIABLES LIKE 'log_slow_queries'; +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 'events_logs_test' as inside_event + +Check slow query log + +Ensure that slow logging is on +show variables like 'log_slow_queries'; Variable_name Value log_slow_queries ON -DROP FUNCTION get_value; -"Make it quite long" -SET SESSION long_query_time=300; -TRUNCATE mysql.slow_log; -SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; -user_host query_time db sql_text -"Set new values" -SET GLOBAL long_query_time=4; -SET SESSION long_query_time=0.5; -"Check that logging is working" -SELECT SLEEP(2); -SLEEP(2) -0 -SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; -user_host query_time db sql_text -USER_HOST SLEEPVAL events_test SELECT SLEEP(2) -SET SESSION long_query_time=300; -"Make it quite long" -TRUNCATE mysql.slow_log; -CREATE TABLE slow_event_test (slo_val tinyint, val tinyint); -SET SESSION long_query_time=1; -"This won't go to the slow log" -SELECT * FROM slow_event_test; -slo_val val -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); -"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; + +Demonstrate that session value has no effect + +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); + +Nothing should be logged + +select user_host, db, sql_text from mysql.slow_log where sql_text not like 'create event%'; +user_host db sql_text +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); + +Event sub-statement should be logged. + +select user_host, db, sql_text from mysql.slow_log where sql_text not like 'create event%'; +user_host db sql_text +USER_HOST events_test select 'events_logs_test' as inside_event, sleep(1.5) +drop database events_test; +set global event_scheduler=off; +set @@global.long_query_time=default; +set @@session.long_query_time=default; diff --git a/mysql-test/t/events_logs_tests.test b/mysql-test/t/events_logs_tests.test index 8617129b90c..b9ceec2ed82 100644 --- a/mysql-test/t/events_logs_tests.test +++ b/mysql-test/t/events_logs_tests.test @@ -1,115 +1,87 @@ # Can't test with embedded server that doesn't support grants -- source include/not_embedded.inc -CREATE DATABASE IF NOT EXISTS events_test; -USE events_test; ---echo "We use procedure here because its statements won't be logged into the general log" ---echo "If we had used normal select that are logged in different ways depending on whether" ---echo "the test suite is run in normal mode or with --ps-protocol" +--disable_warnings +drop database if exists events_test; +--enable_warnings +create database if not exists events_test; +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 |; -CREATE procedure select_general_log() -BEGIN - SELECT user_host, argument FROM mysql.general_log WHERE argument LIKE '%alabala%'; -END| -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; +create procedure select_general_log() +begin + select user_host, argument from mysql.general_log + where argument like '%events_logs_test%'; end| -DELIMITER ;| ---enable_query_log ---echo "Save the values" -SET @old_global_long_query_time:=(select get_value()); -SET @old_session_long_query_time:=@@long_query_time; -SHOW VARIABLES LIKE 'log_slow_queries'; -DROP FUNCTION get_value; ---echo "Make it quite long" -SET SESSION long_query_time=300; -TRUNCATE mysql.slow_log; +delimiter ;| +--echo +--echo Check that general query log works, but sub-statements +--echo of the stored procedure do not leave traces in it. +--echo +truncate mysql.general_log; +# Logging format in ps protocol is slightly different +--disable_ps_protocol +select 'events_logs_tests' as outside_event; +--enable_ps_protocol --replace_column 1 USER_HOST -SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; ---echo "Set new values" -SET GLOBAL long_query_time=4; -SET SESSION long_query_time=0.5; ---echo "Check that logging is working" -SELECT SLEEP(2); ---replace_column 1 USER_HOST 2 SLEEPVAL -SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; -SET SESSION long_query_time=300; ---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; +call select_general_log(); +--echo +--echo Check that unlike sub-statements of stored procedures, +--echo sub-statements of events are present in the general log. +--echo +set global event_scheduler=on; +truncate mysql.general_log; +create event ev_log_general on schedule at now() on completion not preserve do select 'events_logs_test' as inside_event; +--let $wait_condition=select count(*)=0 from information_schema.events where event_name='ev_log_general' --source include/wait_condition.inc ---echo "Check our table. Should see 2 rows" -SELECT * FROM slow_event_test; ---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; +--replace_column 1 USER_HOST +call select_general_log(); -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= select count(*) = 0 from information_schema.processlist where db='events_test' and command = 'Connect' and user=current_user(); From 9c72c3dfdbaecb03b03f847e2ebc44dc00a24367 Mon Sep 17 00:00:00 2001 From: "kostja@bodhi.(none)" <> Date: Sat, 11 Aug 2007 14:07:49 +0400 Subject: [PATCH 03/15] A fix for Bug#29049 lock_multi fails in rare case. The patch changes the test case only. The fix is to replace all 'sleep's with wait_condition. This makes the test deterministic and also ~300 times faster. --- mysql-test/r/lock_multi.result | 8 ++-- mysql-test/t/lock_multi.test | 86 ++++++++++++++++++++++------------ 2 files changed, 60 insertions(+), 34 deletions(-) diff --git a/mysql-test/r/lock_multi.result b/mysql-test/r/lock_multi.result index a3f7ab4505c..e89fbec0aed 100644 --- a/mysql-test/r/lock_multi.result +++ b/mysql-test/r/lock_multi.result @@ -13,9 +13,9 @@ insert into t1 values (1); lock tables t1 read; update low_priority t1 set n = 4; select n from t1; -unlock tables; n 1 +unlock tables; drop table t1; create table t1 (a int, b int); create table t2 (c int, d int); @@ -43,6 +43,7 @@ insert t1 select * from t2; drop table t2; ERROR 42S02: Table 'test.t2' doesn't exist drop table t1; +End of 4.1 tests create table t1(a int); lock tables t1 write; show columns from t1; @@ -91,10 +92,11 @@ DROP DATABASE mysqltest_1; 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; 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; drop table t1; +End of 5.0 tests create table t1 (i int); lock table t1 read; update t1 set i= 10;; diff --git a/mysql-test/t/lock_multi.test b/mysql-test/t/lock_multi.test index b7c406f9637..8ffa67f8439 100644 --- a/mysql-test/t/lock_multi.test +++ b/mysql-test/t/lock_multi.test @@ -16,10 +16,16 @@ lock tables t1 write; connection writer; send update low_priority t1 set n = 4; 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; 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; connection writer; reap; @@ -34,15 +40,15 @@ lock tables t1 read; connection writer; send update low_priority t1 set n = 4; connection reader; ---sleep 2 -send select n from t1; +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 +select n from t1; connection locker; ---sleep 2 unlock tables; connection writer; reap; -connection reader; -reap; drop table t1; # @@ -58,13 +64,9 @@ insert into t1 values(2,2); insert into t2 values(1,2); lock table t1 read; connection writer; ---sleep 2 -send update t1,t2 set c=a where b=d; +update t1,t2 set c=a where b=d; connection reader; ---sleep 2 select c from t2; -connection writer; -reap; connection locker; drop table t1; drop table t2; @@ -73,7 +75,7 @@ drop table t2; # Test problem when using locks on many tables and droping a table that # is to-be-locked by another thread # - +# connection locker; create table t1 (a int); create table t2 (a int); @@ -81,6 +83,10 @@ lock table t1 write, t2 write; connection reader; send insert t1 select * from t2; 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; connection reader; --error 1146 @@ -99,6 +105,10 @@ lock table t1 write, t2 write, t1 as t1_2 write, t2 as t2_2 write; connection reader; send insert t1 select * from t2; 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; connection reader; --error 1146 @@ -107,7 +117,7 @@ connection locker; drop table t1; -# End of 4.1 tests +--echo End of 4.1 tests # # BUG#9998 - MySQL client hangs on USE "database" @@ -131,15 +141,18 @@ connection locker; use mysql; LOCK TABLES columns_priv WRITE, db WRITE, host WRITE, user WRITE; FLUSH TABLES; ---sleep 1 # connection reader; use mysql; #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; ---sleep 1 # 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. --replace_result "Table is already up to date" "OK" OPTIMIZE TABLES columns_priv, db, host, user; @@ -163,10 +176,13 @@ LOCK TABLE t1 WRITE; # This waits until t1 is unlocked. connection locker; send FLUSH TABLES WITH READ LOCK; ---sleep 1 # -# This must not block. 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); UNLOCK TABLES; # @@ -187,10 +203,13 @@ LOCK TABLE t1 WRITE; # This waits until t1 is unlocked. connection locker; send FLUSH TABLES WITH READ LOCK; ---sleep 1 # # This must not block. 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 CREATE TABLE t2 AS SELECT * FROM t1; UNLOCK TABLES; @@ -219,11 +238,15 @@ FLUSH TABLES WITH READ LOCK; # wait in wait_if_global_read_lock(). connection con2; send DROP DATABASE mysqltest_1; ---sleep 1 # # With bug in place: try to acquire LOCK_mysql_create_table... # When fixed: Reject dropping db because of the read lock. 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 DROP DATABASE mysqltest_1; UNLOCK TABLES; @@ -249,17 +272,18 @@ create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) e --enable_warnings lock tables t1 write; connection writer; ---sleep 2 -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 ;// +send alter table t1 auto_increment=0; connection reader; ---sleep 2 -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 ;// +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Locked" and info = "alter table t1 auto_increment=0"; +--source include/wait_condition.inc +send alter table t1 auto_increment=0; 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; connection writer; reap; @@ -267,8 +291,8 @@ connection reader; reap; connection locker; drop table t1; - -# End of 5.0 tests +# +--echo End of 5.0 tests # From f5dc545cb1d92c9662663efbf7756686ef81db41 Mon Sep 17 00:00:00 2001 From: "malff/marcsql@weblab.(none)" <> Date: Tue, 14 Aug 2007 20:31:06 -0600 Subject: [PATCH 04/15] Changed whitespace and indentation only, no logic change. --- sql/sql_yacc.yy | 13549 ++++++++++++++++++++++++---------------------- 1 file changed, 7002 insertions(+), 6547 deletions(-) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index ddd63da9adb..3bbb3abaa54 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -16,7 +16,7 @@ /* sql_yacc.yy */ %{ -/* thd is passed as an arg to yyparse(), and subsequently to yylex(). +/* thd is passed as an argument to yyparse(), and subsequently to yylex(). ** The type will be void*, so it must be cast to (THD*) when used. ** Use the YYTHD macro for this. */ @@ -43,15 +43,27 @@ int yylex(void *yylval, void *yythd); -const LEX_STRING null_lex_str={0,0}; +const LEX_STRING null_lex_str= {0,0}; -#define yyoverflow(A,B,C,D,E,F) {ulong val= *(F); if (my_yyoverflow((B), (D), &val)) { yyerror((char*) (A)); return 2; } else { *(F)= (YYSIZE_T)val; }} +#define yyoverflow(A,B,C,D,E,F) \ + { \ + ulong val= *(F); \ + if (my_yyoverflow((B), (D), &val)) \ + { \ + yyerror((char*) (A)); \ + return 2; \ + } \ + else \ + { \ + *(F)= (YYSIZE_T)val; \ + } \ + } #define MYSQL_YYABORT \ do \ - { \ + { \ LEX::cleanup_lex_after_parse_error(YYTHD);\ - YYABORT; \ + YYABORT; \ } while (0) #define MYSQL_YYABORT_UNLESS(A) \ @@ -1072,43 +1084,43 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); /* A dummy token to force the priority of table_ref production in a join. */ %left TABLE_REF_PRIORITY %left SET_VAR -%left OR_OR_SYM OR_SYM OR2_SYM XOR -%left AND_SYM AND_AND_SYM -%left BETWEEN_SYM CASE_SYM WHEN_SYM THEN_SYM ELSE -%left EQ EQUAL_SYM GE GT_SYM LE LT NE IS LIKE REGEXP IN_SYM -%left '|' -%left '&' -%left SHIFT_LEFT SHIFT_RIGHT -%left '-' '+' -%left '*' '/' '%' DIV_SYM MOD_SYM +%left OR_OR_SYM OR_SYM OR2_SYM XOR +%left AND_SYM AND_AND_SYM +%left BETWEEN_SYM CASE_SYM WHEN_SYM THEN_SYM ELSE +%left EQ EQUAL_SYM GE GT_SYM LE LT NE IS LIKE REGEXP IN_SYM +%left '|' +%left '&' +%left SHIFT_LEFT SHIFT_RIGHT +%left '-' '+' +%left '*' '/' '%' DIV_SYM MOD_SYM %left '^' -%left NEG '~' -%right NOT_SYM NOT2_SYM -%right BINARY COLLATE_SYM +%left NEG '~' +%right NOT_SYM NOT2_SYM +%right BINARY COLLATE_SYM %type IDENT IDENT_QUOTED TEXT_STRING DECIMAL_NUM FLOAT_NUM NUM LONG_NUM HEX_NUM - LEX_HOSTNAME ULONGLONG_NUM field_ident select_alias ident ident_or_text + LEX_HOSTNAME ULONGLONG_NUM field_ident select_alias ident ident_or_text IDENT_sys TEXT_STRING_sys TEXT_STRING_literal - NCHAR_STRING opt_component key_cache_name + NCHAR_STRING opt_component key_cache_name sp_opt_label BIN_NUM label_ident TEXT_STRING_filesystem ident_or_empty %type - opt_table_alias + opt_table_alias %type - table_ident table_ident_nodb references xid + table_ident table_ident_nodb references xid %type - remember_name remember_end opt_ident opt_db text_or_password - opt_constraint constraint + remember_name remember_end opt_ident opt_db text_or_password + opt_constraint constraint %type - text_string opt_gconcat_separator + text_string opt_gconcat_separator %type - type int_type real_type order_dir lock_option - udf_type if_exists opt_local opt_table_options table_options + type int_type real_type order_dir lock_option + udf_type if_exists opt_local opt_table_options table_options table_option opt_if_not_exists opt_no_write_to_binlog delete_option opt_temporary all_or_any opt_distinct opt_ignore_leaves fulltext_options spatial_type union_option @@ -1119,28 +1131,28 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ev_alter_on_schedule_completion opt_ev_rename_to opt_ev_sql_stmt %type - ulong_num real_ulong_num merge_insert_types + ulong_num real_ulong_num merge_insert_types %type - ulonglong_num real_ulonglong_num size_number + ulonglong_num real_ulonglong_num size_number %type part_bit_expr %type - replace_lock_option opt_low_priority insert_lock_option load_data_lock + replace_lock_option opt_low_priority insert_lock_option load_data_lock %type - literal text_literal insert_ident order_ident - simple_ident select_item2 expr opt_expr opt_else sum_expr in_sum_expr - variable variable_aux bool_term bool_factor bool_test bool_pri - predicate bit_expr bit_term bit_factor value_expr term factor - table_wild simple_expr udf_expr - expr_or_default set_expr_or_default interval_expr - param_marker geometry_function - signed_literal now_or_signed_literal opt_escape - sp_opt_default - simple_ident_nospvar simple_ident_q + literal text_literal insert_ident order_ident + simple_ident select_item2 expr opt_expr opt_else sum_expr in_sum_expr + variable variable_aux bool_term bool_factor bool_test bool_pri + predicate bit_expr bit_term bit_factor value_expr term factor + table_wild simple_expr udf_expr + expr_or_default set_expr_or_default interval_expr + param_marker geometry_function + signed_literal now_or_signed_literal opt_escape + sp_opt_default + simple_ident_nospvar simple_ident_q field_or_var limit_option part_func_expr function_call_keyword @@ -1149,29 +1161,29 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); function_call_conflict %type - NUM_literal + NUM_literal %type - expr_list udf_expr_list udf_expr_list2 when_list - ident_list ident_list_arg opt_expr_list + expr_list udf_expr_list udf_expr_list2 when_list + ident_list ident_list_arg opt_expr_list %type option_type opt_var_type opt_var_ident_type %type - key_type opt_unique_or_fulltext constraint_key_type + key_type opt_unique_or_fulltext constraint_key_type %type - btree_or_rtree + btree_or_rtree %type - using_list + using_list %type - key_part + key_part %type - join_table_list join_table + join_table_list join_table table_factor table_ref select_derived derived_table_list @@ -1197,58 +1209,58 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); %type user grant_user %type - opt_collate - charset_name - charset_name_or_default - old_or_new_charset_name - old_or_new_charset_name_or_default - collation_name - collation_name_or_default - opt_load_data_charset + opt_collate + charset_name + charset_name_or_default + old_or_new_charset_name + old_or_new_charset_name_or_default + collation_name + collation_name_or_default + opt_load_data_charset UNDERSCORE_CHARSET %type internal_variable_name %type subselect subselect_init - get_select_lex + get_select_lex %type comp_op %type - query verb_clause create change select do drop insert replace insert2 - insert_values update delete truncate rename - show describe load alter optimize keycache preload flush - reset purge begin commit rollback savepoint release - slave master_def master_defs master_file_def slave_until_opts - repair restore backup analyze check start checksum - field_list field_list_item field_spec kill column_def key_def - keycache_list assign_to_keycache preload_list preload_keys - select_item_list select_item values_list no_braces - opt_limit_clause delete_limit_clause fields opt_values values - procedure_list procedure_list2 procedure_item - expr_list2 udf_expr_list3 handler - opt_precision opt_ignore opt_column opt_restrict - grant revoke set lock unlock string_list field_options field_option - field_opt_list opt_binary table_lock_list table_lock - ref_list opt_on_delete opt_on_delete_list opt_on_delete_item use - opt_delete_options opt_delete_option varchar nchar nvarchar - opt_outer table_list table_name opt_option opt_place - opt_attribute opt_attribute_list attribute column_list column_list_id - opt_column_list grant_privileges grant_ident grant_list grant_option - object_privilege object_privilege_list user_list rename_list - clear_privileges flush_options flush_option - equal optional_braces - opt_mi_check_type opt_to mi_check_types normal_join - db_to_db table_to_table_list table_to_table opt_table_list opt_as - handler_rkey_function handler_read_or_scan - single_multi table_wild_list table_wild_one opt_wild - union_clause union_list - precision subselect_start opt_and charset - subselect_end select_var_list select_var_list_init help opt_len - opt_extended_describe + query verb_clause create change select do drop insert replace insert2 + insert_values update delete truncate rename + show describe load alter optimize keycache preload flush + reset purge begin commit rollback savepoint release + slave master_def master_defs master_file_def slave_until_opts + repair restore backup analyze check start checksum + field_list field_list_item field_spec kill column_def key_def + keycache_list assign_to_keycache preload_list preload_keys + select_item_list select_item values_list no_braces + opt_limit_clause delete_limit_clause fields opt_values values + procedure_list procedure_list2 procedure_item + expr_list2 udf_expr_list3 handler + opt_precision opt_ignore opt_column opt_restrict + grant revoke set lock unlock string_list field_options field_option + field_opt_list opt_binary table_lock_list table_lock + ref_list opt_on_delete opt_on_delete_list opt_on_delete_item use + opt_delete_options opt_delete_option varchar nchar nvarchar + opt_outer table_list table_name opt_option opt_place + opt_attribute opt_attribute_list attribute column_list column_list_id + opt_column_list grant_privileges grant_ident grant_list grant_option + object_privilege object_privilege_list user_list rename_list + clear_privileges flush_options flush_option + equal optional_braces + opt_mi_check_type opt_to mi_check_types normal_join + db_to_db table_to_table_list table_to_table opt_table_list opt_as + handler_rkey_function handler_read_or_scan + single_multi table_wild_list table_wild_one opt_wild + union_clause union_list + precision subselect_start opt_and charset + subselect_end select_var_list select_var_list_init help opt_len + opt_extended_describe prepare prepare_src execute deallocate - statement sp_suid - sp_c_chistics sp_a_chistics sp_chistic sp_c_chistic xa + statement sp_suid + sp_c_chistics sp_a_chistics sp_chistic sp_c_chistic xa load_data opt_field_or_var_spec fields_or_vars opt_load_data_set_spec definer view_replace_or_algorithm view_replace view_algorithm view_or_trigger_or_sp_or_event @@ -1256,7 +1268,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); view_suid view_tail view_list_opt view_list view_select view_check_option trigger_tail sp_tail install uninstall partition_entry binlog_base64_event - init_key_options key_options key_opts key_opt key_using_alg + init_key_options key_options key_opts key_opt key_using_alg server_def server_options_list server_option END_OF_INPUT @@ -1277,376 +1289,396 @@ END_OF_INPUT %type index_hint_clause %type - '-' '+' '*' '/' '%' '(' ')' - ',' '!' '{' '}' '&' '|' AND_SYM OR_SYM OR_OR_SYM BETWEEN_SYM CASE_SYM - THEN_SYM WHEN_SYM DIV_SYM MOD_SYM OR2_SYM AND_AND_SYM + '-' '+' '*' '/' '%' '(' ')' + ',' '!' '{' '}' '&' '|' AND_SYM OR_SYM OR_OR_SYM BETWEEN_SYM CASE_SYM + THEN_SYM WHEN_SYM DIV_SYM MOD_SYM OR2_SYM AND_AND_SYM %% +/* + Indentation of grammar rules: + +rule: <-- starts at col 1 + rule1a rule1b rule1c <-- starts at col 11 + { <-- starts at col 11 + code <-- starts at col 13, indentation is 2 spaces + } + | rule2a rule2b + { + code + } + ; <-- on a line by itself, starts at col 9 + +Also, please do not use any , but spaces. +Having a uniform indentation in this file helps +code reviews, patches, merges, and make maintenance easier. +Thanks. +*/ query: - END_OF_INPUT - { - THD *thd= YYTHD; - if (!thd->bootstrap && - (!(thd->lex->select_lex.options & OPTION_FOUND_COMMENT))) - { - my_message(ER_EMPTY_QUERY, ER(ER_EMPTY_QUERY), MYF(0)); - MYSQL_YYABORT; - } - else - { - thd->lex->sql_command= SQLCOM_EMPTY_QUERY; - } - } - | verb_clause END_OF_INPUT {}; + END_OF_INPUT + { + THD *thd= YYTHD; + if (!thd->bootstrap && + (!(thd->lex->select_lex.options & OPTION_FOUND_COMMENT))) + { + my_message(ER_EMPTY_QUERY, ER(ER_EMPTY_QUERY), MYF(0)); + MYSQL_YYABORT; + } + else + { + thd->lex->sql_command= SQLCOM_EMPTY_QUERY; + } + } + | verb_clause END_OF_INPUT {} + ; verb_clause: - statement - | begin - ; + statement + | begin + ; /* Verb clauses, except begin */ statement: - alter - | analyze - | backup - | binlog_base64_event - | call - | change - | check - | checksum - | commit - | create + alter + | analyze + | backup + | binlog_base64_event + | call + | change + | check + | checksum + | commit + | create | deallocate - | delete - | describe - | do - | drop + | delete + | describe + | do + | drop | execute - | flush - | grant - | handler - | help - | insert + | flush + | grant + | handler + | help + | insert | install - | kill - | load - | lock - | optimize + | kill + | load + | lock + | optimize | keycache | partition_entry - | preload + | preload | prepare - | purge - | release - | rename - | repair - | replace - | reset - | restore - | revoke - | rollback - | savepoint - | select - | set - | show - | slave - | start - | truncate + | purge + | release + | rename + | repair + | replace + | reset + | restore + | revoke + | rollback + | savepoint + | select + | set + | show + | slave + | start + | truncate | uninstall - | unlock - | update - | use - | xa + | unlock + | update + | use + | xa ; deallocate: - deallocate_or_drop PREPARE_SYM ident - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - lex->sql_command= SQLCOM_DEALLOCATE_PREPARE; - lex->prepared_stmt_name= $3; - }; + deallocate_or_drop PREPARE_SYM ident + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + lex->sql_command= SQLCOM_DEALLOCATE_PREPARE; + lex->prepared_stmt_name= $3; + } + ; deallocate_or_drop: - DEALLOCATE_SYM | - DROP - ; - + DEALLOCATE_SYM + | DROP + ; prepare: - PREPARE_SYM ident FROM prepare_src - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - lex->sql_command= SQLCOM_PREPARE; - lex->prepared_stmt_name= $2; - }; + PREPARE_SYM ident FROM prepare_src + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + lex->sql_command= SQLCOM_PREPARE; + lex->prepared_stmt_name= $2; + } + ; prepare_src: - TEXT_STRING_sys - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - lex->prepared_stmt_code= $1; - lex->prepared_stmt_code_is_varref= FALSE; - } + TEXT_STRING_sys + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + lex->prepared_stmt_code= $1; + lex->prepared_stmt_code_is_varref= FALSE; + } | '@' ident_or_text - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - lex->prepared_stmt_code= $2; - lex->prepared_stmt_code_is_varref= TRUE; - }; + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + lex->prepared_stmt_code= $2; + lex->prepared_stmt_code_is_varref= TRUE; + } + ; execute: - EXECUTE_SYM ident - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - lex->sql_command= SQLCOM_EXECUTE; - lex->prepared_stmt_name= $2; - } - execute_using - {} + EXECUTE_SYM ident + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + lex->sql_command= SQLCOM_EXECUTE; + lex->prepared_stmt_name= $2; + } + execute_using + {} ; execute_using: - /* nothing */ + /* nothing */ | USING execute_var_list ; execute_var_list: - execute_var_list ',' execute_var_ident + execute_var_list ',' execute_var_ident | execute_var_ident ; -execute_var_ident: '@' ident_or_text - { - LEX *lex=Lex; - LEX_STRING *lexstr= (LEX_STRING*)sql_memdup(&$2, sizeof(LEX_STRING)); - if (!lexstr || lex->prepared_stmt_params.push_back(lexstr)) +execute_var_ident: + '@' ident_or_text + { + LEX *lex=Lex; + LEX_STRING *lexstr= (LEX_STRING*)sql_memdup(&$2, sizeof(LEX_STRING)); + if (!lexstr || lex->prepared_stmt_params.push_back(lexstr)) MYSQL_YYABORT; - } + } ; /* help */ help: - HELP_SYM - { - if (Lex->sphead) - { - my_error(ER_SP_BADSTATEMENT, MYF(0), "HELP"); - MYSQL_YYABORT; - } - } - ident_or_text - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_HELP; - lex->help_arg= $3.str; - }; + HELP_SYM + { + if (Lex->sphead) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), "HELP"); + MYSQL_YYABORT; + } + } + ident_or_text + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_HELP; + lex->help_arg= $3.str; + } + ; /* change master */ change: - CHANGE MASTER_SYM TO_SYM - { - LEX *lex = Lex; - lex->sql_command = SQLCOM_CHANGE_MASTER; - bzero((char*) &lex->mi, sizeof(lex->mi)); - } - master_defs - {} - ; + CHANGE MASTER_SYM TO_SYM + { + LEX *lex = Lex; + lex->sql_command = SQLCOM_CHANGE_MASTER; + bzero((char*) &lex->mi, sizeof(lex->mi)); + } + master_defs + {} + ; master_defs: - master_def - | master_defs ',' master_def; + master_def + | master_defs ',' master_def + ; master_def: - MASTER_HOST_SYM EQ TEXT_STRING_sys - { - Lex->mi.host = $3.str; - } - | - MASTER_USER_SYM EQ TEXT_STRING_sys - { - Lex->mi.user = $3.str; - } - | - MASTER_PASSWORD_SYM EQ TEXT_STRING_sys - { - Lex->mi.password = $3.str; - } - | - MASTER_PORT_SYM EQ ulong_num - { - Lex->mi.port = $3; - } - | - MASTER_CONNECT_RETRY_SYM EQ ulong_num - { - Lex->mi.connect_retry = $3; - } - | MASTER_SSL_SYM EQ ulong_num - { - Lex->mi.ssl= $3 ? - LEX_MASTER_INFO::SSL_ENABLE : LEX_MASTER_INFO::SSL_DISABLE; - } - | MASTER_SSL_CA_SYM EQ TEXT_STRING_sys - { - Lex->mi.ssl_ca= $3.str; - } - | MASTER_SSL_CAPATH_SYM EQ TEXT_STRING_sys - { - Lex->mi.ssl_capath= $3.str; - } - | MASTER_SSL_CERT_SYM EQ TEXT_STRING_sys - { - Lex->mi.ssl_cert= $3.str; - } - | MASTER_SSL_CIPHER_SYM EQ TEXT_STRING_sys - { - Lex->mi.ssl_cipher= $3.str; - } - | MASTER_SSL_KEY_SYM EQ TEXT_STRING_sys - { - Lex->mi.ssl_key= $3.str; - } - | MASTER_SSL_VERIFY_SERVER_CERT_SYM EQ ulong_num - { - Lex->mi.ssl_verify_server_cert= $3 ? - LEX_MASTER_INFO::SSL_ENABLE : LEX_MASTER_INFO::SSL_DISABLE; - } - | - master_file_def - ; + MASTER_HOST_SYM EQ TEXT_STRING_sys + { + Lex->mi.host = $3.str; + } + | MASTER_USER_SYM EQ TEXT_STRING_sys + { + Lex->mi.user = $3.str; + } + | MASTER_PASSWORD_SYM EQ TEXT_STRING_sys + { + Lex->mi.password = $3.str; + } + | MASTER_PORT_SYM EQ ulong_num + { + Lex->mi.port = $3; + } + | MASTER_CONNECT_RETRY_SYM EQ ulong_num + { + Lex->mi.connect_retry = $3; + } + | MASTER_SSL_SYM EQ ulong_num + { + Lex->mi.ssl= $3 ? + LEX_MASTER_INFO::SSL_ENABLE : LEX_MASTER_INFO::SSL_DISABLE; + } + | MASTER_SSL_CA_SYM EQ TEXT_STRING_sys + { + Lex->mi.ssl_ca= $3.str; + } + | MASTER_SSL_CAPATH_SYM EQ TEXT_STRING_sys + { + Lex->mi.ssl_capath= $3.str; + } + | MASTER_SSL_CERT_SYM EQ TEXT_STRING_sys + { + Lex->mi.ssl_cert= $3.str; + } + | MASTER_SSL_CIPHER_SYM EQ TEXT_STRING_sys + { + Lex->mi.ssl_cipher= $3.str; + } + | MASTER_SSL_KEY_SYM EQ TEXT_STRING_sys + { + Lex->mi.ssl_key= $3.str; + } + | MASTER_SSL_VERIFY_SERVER_CERT_SYM EQ ulong_num + { + Lex->mi.ssl_verify_server_cert= $3 ? + LEX_MASTER_INFO::SSL_ENABLE : LEX_MASTER_INFO::SSL_DISABLE; + } + | master_file_def + ; master_file_def: - MASTER_LOG_FILE_SYM EQ TEXT_STRING_sys - { - Lex->mi.log_file_name = $3.str; - } - | MASTER_LOG_POS_SYM EQ ulonglong_num - { - Lex->mi.pos = $3; - /* - If the user specified a value < BIN_LOG_HEADER_SIZE, adjust it - instead of causing subsequent errors. - We need to do it in this file, because only there we know that - MASTER_LOG_POS has been explicitely specified. On the contrary - in change_master() (sql_repl.cc) we cannot distinguish between 0 - (MASTER_LOG_POS explicitely specified as 0) and 0 (unspecified), - whereas we want to distinguish (specified 0 means "read the binlog - from 0" (4 in fact), unspecified means "don't change the position - (keep the preceding value)"). - */ - Lex->mi.pos = max(BIN_LOG_HEADER_SIZE, Lex->mi.pos); - } - | RELAY_LOG_FILE_SYM EQ TEXT_STRING_sys - { - Lex->mi.relay_log_name = $3.str; - } - | RELAY_LOG_POS_SYM EQ ulong_num - { - Lex->mi.relay_log_pos = $3; - /* Adjust if < BIN_LOG_HEADER_SIZE (same comment as Lex->mi.pos) */ - Lex->mi.relay_log_pos = max(BIN_LOG_HEADER_SIZE, Lex->mi.relay_log_pos); - } - ; + MASTER_LOG_FILE_SYM EQ TEXT_STRING_sys + { + Lex->mi.log_file_name = $3.str; + } + | MASTER_LOG_POS_SYM EQ ulonglong_num + { + Lex->mi.pos = $3; + /* + If the user specified a value < BIN_LOG_HEADER_SIZE, adjust it + instead of causing subsequent errors. + We need to do it in this file, because only there we know that + MASTER_LOG_POS has been explicitely specified. On the contrary + in change_master() (sql_repl.cc) we cannot distinguish between 0 + (MASTER_LOG_POS explicitely specified as 0) and 0 (unspecified), + whereas we want to distinguish (specified 0 means "read the binlog + from 0" (4 in fact), unspecified means "don't change the position + (keep the preceding value)"). + */ + Lex->mi.pos = max(BIN_LOG_HEADER_SIZE, Lex->mi.pos); + } + | RELAY_LOG_FILE_SYM EQ TEXT_STRING_sys + { + Lex->mi.relay_log_name = $3.str; + } + | RELAY_LOG_POS_SYM EQ ulong_num + { + Lex->mi.relay_log_pos = $3; + /* Adjust if < BIN_LOG_HEADER_SIZE (same comment as Lex->mi.pos) */ + Lex->mi.relay_log_pos = max(BIN_LOG_HEADER_SIZE, Lex->mi.relay_log_pos); + } + ; /* create a table */ create: - CREATE opt_table_options TABLE_SYM opt_if_not_exists table_ident - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - lex->sql_command= SQLCOM_CREATE_TABLE; - if (!lex->select_lex.add_table_to_list(thd, $5, NULL, - TL_OPTION_UPDATING, - TL_WRITE)) - MYSQL_YYABORT; - lex->alter_info.reset(); - lex->col_list.empty(); - lex->change=NullS; - bzero((char*) &lex->create_info,sizeof(lex->create_info)); - lex->create_info.options=$2 | $4; - lex->create_info.db_type= ha_default_handlerton(thd); - lex->create_info.default_table_charset= NULL; - lex->name.str= 0; - lex->name.length= 0; - } - create2 - { - LEX *lex= YYTHD->lex; - lex->current_select= &lex->select_lex; - if (!lex->create_info.db_type) + CREATE opt_table_options TABLE_SYM opt_if_not_exists table_ident { - lex->create_info.db_type= ha_default_handlerton(YYTHD); - push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_WARN_USING_OTHER_HANDLER, - ER(ER_WARN_USING_OTHER_HANDLER), - ha_resolve_storage_engine_name(lex->create_info.db_type), - $5->table.str); + THD *thd= YYTHD; + LEX *lex= thd->lex; + lex->sql_command= SQLCOM_CREATE_TABLE; + if (!lex->select_lex.add_table_to_list(thd, $5, NULL, + TL_OPTION_UPDATING, + TL_WRITE)) + MYSQL_YYABORT; + lex->alter_info.reset(); + lex->col_list.empty(); + lex->change=NullS; + bzero((char*) &lex->create_info,sizeof(lex->create_info)); + lex->create_info.options=$2 | $4; + lex->create_info.db_type= ha_default_handlerton(thd); + lex->create_info.default_table_charset= NULL; + lex->name.str= 0; + lex->name.length= 0; } - } - | CREATE opt_unique_or_fulltext INDEX_SYM ident key_alg ON - table_ident - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_CREATE_INDEX; - if (!lex->current_select->add_table_to_list(lex->thd, $7, - NULL, - TL_OPTION_UPDATING)) - MYSQL_YYABORT; + create2 + { + LEX *lex= YYTHD->lex; + lex->current_select= &lex->select_lex; + if (!lex->create_info.db_type) + { + lex->create_info.db_type= ha_default_handlerton(YYTHD); + push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_USING_OTHER_HANDLER, + ER(ER_WARN_USING_OTHER_HANDLER), + ha_resolve_storage_engine_name(lex->create_info.db_type), + $5->table.str); + } + } + | CREATE opt_unique_or_fulltext INDEX_SYM ident key_alg ON + table_ident + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_CREATE_INDEX; + if (!lex->current_select->add_table_to_list(lex->thd, $7, + NULL, + TL_OPTION_UPDATING)) + MYSQL_YYABORT; lex->alter_info.reset(); lex->alter_info.flags= ALTER_ADD_INDEX; - lex->col_list.empty(); - lex->change=NullS; - } - '(' key_list ')' key_options - { - LEX *lex=Lex; + lex->col_list.empty(); + lex->change=NullS; + } + '(' key_list ')' key_options + { + LEX *lex=Lex; Key *key; - if ($2 != Key::FULLTEXT && lex->key_create_info.parser_name.str) - { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } + if ($2 != Key::FULLTEXT && lex->key_create_info.parser_name.str) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } key= new Key($2, $4.str, &lex->key_create_info, 0, lex->col_list); lex->alter_info.key_list.push_back(key); - lex->col_list.empty(); - } - | CREATE DATABASE opt_if_not_exists ident - { - Lex->create_info.default_table_charset= NULL; - Lex->create_info.used_fields= 0; + lex->col_list.empty(); } - opt_create_database_options - { - LEX *lex=Lex; - lex->sql_command=SQLCOM_CREATE_DB; - lex->name= $4; + | CREATE DATABASE opt_if_not_exists ident + { + Lex->create_info.default_table_charset= NULL; + Lex->create_info.used_fields= 0; + } + opt_create_database_options + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_CREATE_DB; + lex->name= $4; lex->create_info.options=$3; - } - | CREATE - { + } + | CREATE + { Lex->create_view_mode= VIEW_CREATE_NEW; Lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED; Lex->create_view_suid= TRUE; - } - view_or_trigger_or_sp_or_event - {} - | CREATE USER clear_privileges grant_list - { - Lex->sql_command = SQLCOM_CREATE_USER; } - | CREATE LOGFILE_SYM GROUP_SYM logfile_group_info + view_or_trigger_or_sp_or_event + {} + | CREATE USER clear_privileges grant_list + { + Lex->sql_command = SQLCOM_CREATE_USER; + } + | CREATE LOGFILE_SYM GROUP_SYM logfile_group_info { Lex->alter_tablespace_info->ts_cmd_type= CREATE_LOGFILE_GROUP; } @@ -1654,67 +1686,66 @@ create: { Lex->alter_tablespace_info->ts_cmd_type= CREATE_TABLESPACE; } - | CREATE server_def - { - Lex->sql_command= SQLCOM_CREATE_SERVER; + | CREATE server_def + { + Lex->sql_command= SQLCOM_CREATE_SERVER; } - ; + ; + server_def: - SERVER_SYM ident_or_text FOREIGN DATA_SYM WRAPPER_SYM ident_or_text OPTIONS_SYM '(' server_options_list ')' - { - Lex->server_options.server_name= $2.str; - Lex->server_options.server_name_length= $2.length; - Lex->server_options.scheme= $6.str; - } + SERVER_SYM + ident_or_text + FOREIGN DATA_SYM WRAPPER_SYM + ident_or_text + OPTIONS_SYM '(' server_options_list ')' + { + Lex->server_options.server_name= $2.str; + Lex->server_options.server_name_length= $2.length; + Lex->server_options.scheme= $6.str; + } ; server_options_list: - server_option + server_option | server_options_list ',' server_option ; server_option: - USER TEXT_STRING_sys - { - Lex->server_options.username= $2.str; - } - | - HOST_SYM TEXT_STRING_sys - { - Lex->server_options.host= $2.str; - } - | - DATABASE TEXT_STRING_sys - { - Lex->server_options.db= $2.str; - } - | - OWNER_SYM TEXT_STRING_sys - { - Lex->server_options.owner= $2.str; - } - | - PASSWORD TEXT_STRING_sys - { - Lex->server_options.password= $2.str; - } - | - SOCKET_SYM TEXT_STRING_sys - { - Lex->server_options.socket= $2.str; - } - | - PORT_SYM ulong_num - { - Lex->server_options.port= $2; - } + USER TEXT_STRING_sys + { + Lex->server_options.username= $2.str; + } + | HOST_SYM TEXT_STRING_sys + { + Lex->server_options.host= $2.str; + } + | DATABASE TEXT_STRING_sys + { + Lex->server_options.db= $2.str; + } + | OWNER_SYM TEXT_STRING_sys + { + Lex->server_options.owner= $2.str; + } + | PASSWORD TEXT_STRING_sys + { + Lex->server_options.password= $2.str; + } + | SOCKET_SYM TEXT_STRING_sys + { + Lex->server_options.socket= $2.str; + } + | PORT_SYM ulong_num + { + Lex->server_options.port= $2; + } ; event_tail: EVENT_SYM opt_if_not_exists sp_name /* - BE CAREFUL when you add a new rule to update the block where - YYTHD->client_capabilities is set back to original value + BE CAREFUL when you add a new rule to update the block where + YYTHD->client_capabilities is set back to original value */ { THD *thd= YYTHD; @@ -1758,10 +1789,11 @@ event_tail: */ Lex->sql_command= SQLCOM_CREATE_EVENT; } - ; + ; -ev_schedule_time: EVERY_SYM expr interval - { +ev_schedule_time: + EVERY_SYM expr interval + { Lex->event_parse_data->item_expression= $2; Lex->event_parse_data->interval= $3; } @@ -1773,7 +1805,8 @@ ev_schedule_time: EVERY_SYM expr interval } ; -opt_ev_status: /* empty */ { $$= 0; } +opt_ev_status: + /* empty */ { $$= 0; } | ENABLE_SYM { Lex->event_parse_data->status= Event_basic::ENABLED; @@ -1789,9 +1822,10 @@ opt_ev_status: /* empty */ { $$= 0; } Lex->event_parse_data->status= Event_basic::DISABLED; $$= 1; } - ; + ; -ev_starts: /* empty */ +ev_starts: + /* empty */ { Lex->event_parse_data->item_starts= new Item_func_now_local(); } @@ -1799,18 +1833,20 @@ ev_starts: /* empty */ { Lex->event_parse_data->item_starts= $2; } - ; + ; -ev_ends: /* empty */ +ev_ends: + /* empty */ | ENDS_SYM expr { Lex->event_parse_data->item_ends= $2; } - ; + ; -opt_ev_on_completion: /* empty */ { $$= 0; } +opt_ev_on_completion: + /* empty */ { $$= 0; } | ev_on_completion - ; + ; ev_on_completion: ON COMPLETION_SYM PRESERVE_SYM @@ -1825,15 +1861,16 @@ ev_on_completion: Event_basic::ON_COMPLETION_DROP; $$= 1; } - ; + ; -opt_ev_comment: /* empty */ { $$= 0; } +opt_ev_comment: + /* empty */ { $$= 0; } | COMMENT_SYM TEXT_STRING_sys { Lex->comment= Lex->event_parse_data->comment= $2; $$= 1; } - ; + ; ev_sql_stmt: { @@ -1869,7 +1906,7 @@ ev_sql_stmt: lex->sphead->reset_thd_mem_root(thd); lex->sphead->init(lex); - lex->sphead->init_sp_name(thd, lex->event_parse_data->identifier); + lex->sphead->init_sp_name(thd, lex->event_parse_data->identifier); lex->sphead->m_type= TYPE_ENUM_PROCEDURE; @@ -1891,7 +1928,7 @@ ev_sql_stmt: lex->event_parse_data->body_changed= TRUE; } - ; + ; ev_sql_stmt_inner: sp_proc_stmt_statement @@ -1905,61 +1942,60 @@ ev_sql_stmt_inner: | sp_proc_stmt_open | sp_proc_stmt_fetch | sp_proc_stmt_close - ; - + ; clear_privileges: - /* Nothing */ - { - LEX *lex=Lex; - lex->users_list.empty(); - lex->columns.empty(); - lex->grant= lex->grant_tot_col= 0; - lex->all_privileges= 0; - lex->select_lex.db= 0; - lex->ssl_type= SSL_TYPE_NOT_SPECIFIED; - lex->ssl_cipher= lex->x509_subject= lex->x509_issuer= 0; - bzero((char *)&(lex->mqh),sizeof(lex->mqh)); - } + /* Nothing */ + { + LEX *lex=Lex; + lex->users_list.empty(); + lex->columns.empty(); + lex->grant= lex->grant_tot_col= 0; + lex->all_privileges= 0; + lex->select_lex.db= 0; + lex->ssl_type= SSL_TYPE_NOT_SPECIFIED; + lex->ssl_cipher= lex->x509_subject= lex->x509_issuer= 0; + bzero((char *)&(lex->mqh),sizeof(lex->mqh)); + } ; sp_name: - ident '.' ident - { + ident '.' ident + { if (!$1.str || check_db_name(&$1)) { - my_error(ER_WRONG_DB_NAME, MYF(0), $1.str); - MYSQL_YYABORT; - } - if (check_routine_name(&$3)) + my_error(ER_WRONG_DB_NAME, MYF(0), $1.str); + MYSQL_YYABORT; + } + if (check_routine_name(&$3)) { - MYSQL_YYABORT; - } - $$= new sp_name($1, $3, true); - $$->init_qname(YYTHD); - } - | ident - { + MYSQL_YYABORT; + } + $$= new sp_name($1, $3, true); + $$->init_qname(YYTHD); + } + | ident + { THD *thd= YYTHD; LEX *lex= thd->lex; LEX_STRING db; - if (check_routine_name(&$1)) + if (check_routine_name(&$1)) { - MYSQL_YYABORT; - } + MYSQL_YYABORT; + } if (lex->copy_db_to(&db.str, &db.length)) MYSQL_YYABORT; - $$= new sp_name(db, $1, false); + $$= new sp_name(db, $1, false); if ($$) - $$->init_qname(thd); - } - ; + $$->init_qname(thd); + } + ; create_function_tail: - RETURNS_SYM udf_type SONAME_SYM TEXT_STRING_sys - { + RETURNS_SYM udf_type SONAME_SYM TEXT_STRING_sys + { THD *thd= YYTHD; - LEX *lex= thd->lex; + LEX *lex= thd->lex; if (lex->definer != NULL) { /* @@ -1968,7 +2004,7 @@ create_function_tail: Using DEFINER with UDF has therefore no semantic, and is considered a parsing error. */ - my_error(ER_WRONG_USAGE, MYF(0), "SONAME", "DEFINER"); + my_error(ER_WRONG_USAGE, MYF(0), "SONAME", "DEFINER"); MYSQL_YYABORT; } if (is_native_function(thd, & lex->spname->m_name)) @@ -1977,17 +2013,17 @@ create_function_tail: lex->spname->m_name.str); MYSQL_YYABORT; } - lex->sql_command = SQLCOM_CREATE_FUNCTION; - lex->udf.name = lex->spname->m_name; - lex->udf.returns=(Item_result) $2; - lex->udf.dl=$4.str; - } - | '(' - { + lex->sql_command = SQLCOM_CREATE_FUNCTION; + lex->udf.name = lex->spname->m_name; + lex->udf.returns=(Item_result) $2; + lex->udf.dl=$4.str; + } + | '(' + { THD *thd= YYTHD; LEX *lex= thd->lex; Lex_input_stream *lip= thd->m_lip; - sp_head *sp; + sp_head *sp; const char* tmp_param_begin; /* @@ -2000,51 +2036,51 @@ create_function_tail: MYSQL_YYABORT; } - if (lex->sphead) - { - my_error(ER_SP_NO_RECURSIVE_CREATE, MYF(0), "FUNCTION"); - MYSQL_YYABORT; - } - /* Order is important here: new - reset - init */ - sp= new sp_head(); - sp->reset_thd_mem_root(thd); - sp->init(lex); + if (lex->sphead) + { + my_error(ER_SP_NO_RECURSIVE_CREATE, MYF(0), "FUNCTION"); + MYSQL_YYABORT; + } + /* Order is important here: new - reset - init */ + sp= new sp_head(); + sp->reset_thd_mem_root(thd); + sp->init(lex); sp->init_sp_name(thd, lex->spname); - sp->m_type= TYPE_ENUM_FUNCTION; - lex->sphead= sp; - /* - We have to turn off CLIENT_MULTI_QUERIES while parsing a - stored procedure, otherwise yylex will chop it into pieces - at each ';'. - */ + sp->m_type= TYPE_ENUM_FUNCTION; + lex->sphead= sp; + /* + We have to turn off CLIENT_MULTI_QUERIES while parsing a + stored procedure, otherwise yylex will chop it into pieces + at each ';'. + */ $$= thd->client_capabilities & CLIENT_MULTI_QUERIES; - thd->client_capabilities &= ~CLIENT_MULTI_QUERIES; + thd->client_capabilities &= ~CLIENT_MULTI_QUERIES; tmp_param_begin= lip->get_cpp_tok_start(); tmp_param_begin++; lex->sphead->m_param_begin= tmp_param_begin; - } + } sp_fdparam_list ')' - { + { THD *thd= YYTHD; LEX *lex= thd->lex; Lex_input_stream *lip= thd->m_lip; lex->sphead->m_param_end= lip->get_cpp_tok_start(); - } - RETURNS_SYM - { - LEX *lex= Lex; - lex->charset= NULL; - lex->length= lex->dec= NULL; - lex->interval_list.empty(); - lex->type= 0; - } - type - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; + } + RETURNS_SYM + { + LEX *lex= Lex; + lex->charset= NULL; + lex->length= lex->dec= NULL; + lex->interval_list.empty(); + lex->type= 0; + } + type + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; /* This was disabled in 5.1.12. See bug #20701 When collation support in SP is implemented, then this test @@ -2062,28 +2098,28 @@ create_function_tail: &sp->m_return_field_def)) MYSQL_YYABORT; - bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics)); - } - sp_c_chistics - { + bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics)); + } + sp_c_chistics + { THD *thd= YYTHD; LEX *lex= thd->lex; Lex_input_stream *lip= thd->m_lip; - lex->sphead->m_chistics= &lex->sp_chistics; + lex->sphead->m_chistics= &lex->sp_chistics; lex->sphead->set_body_start(thd, lip->get_cpp_tok_start()); - } - sp_proc_stmt - { + } + sp_proc_stmt + { THD *thd= YYTHD; - LEX *lex= thd->lex; - sp_head *sp= lex->sphead; + LEX *lex= thd->lex; + sp_head *sp= lex->sphead; if (sp->is_not_allowed_in_function("function")) MYSQL_YYABORT; - lex->sql_command= SQLCOM_CREATE_SPFUNCTION; - sp->set_stmt_end(thd); + lex->sql_command= SQLCOM_CREATE_SPFUNCTION; + sp->set_stmt_end(thd); if (!(sp->m_flags & sp_head::HAS_RETURN)) { my_error(ER_SP_NORETURN, MYF(0), sp->m_qname.str); @@ -2124,76 +2160,76 @@ create_function_tail: ER(ER_NATIVE_FCT_NAME_COLLISION), sp->m_name.str); } - /* Restore flag if it was cleared above */ - thd->client_capabilities |= $2; - sp->restore_thd_mem_root(thd); - } - ; + /* Restore flag if it was cleared above */ + thd->client_capabilities |= $2; + sp->restore_thd_mem_root(thd); + } + ; sp_a_chistics: - /* Empty */ {} - | sp_a_chistics sp_chistic {} - ; + /* Empty */ {} + | sp_a_chistics sp_chistic {} + ; sp_c_chistics: - /* Empty */ {} - | sp_c_chistics sp_c_chistic {} - ; + /* Empty */ {} + | sp_c_chistics sp_c_chistic {} + ; /* Characteristics for both create and alter */ sp_chistic: - COMMENT_SYM TEXT_STRING_sys - { Lex->sp_chistics.comment= $2; } - | LANGUAGE_SYM SQL_SYM - { /* Just parse it, we only have one language for now. */ } - | NO_SYM SQL_SYM - { Lex->sp_chistics.daccess= SP_NO_SQL; } - | CONTAINS_SYM SQL_SYM - { Lex->sp_chistics.daccess= SP_CONTAINS_SQL; } - | READS_SYM SQL_SYM DATA_SYM - { Lex->sp_chistics.daccess= SP_READS_SQL_DATA; } - | MODIFIES_SYM SQL_SYM DATA_SYM - { Lex->sp_chistics.daccess= SP_MODIFIES_SQL_DATA; } - | sp_suid - { } - ; + COMMENT_SYM TEXT_STRING_sys + { Lex->sp_chistics.comment= $2; } + | LANGUAGE_SYM SQL_SYM + { /* Just parse it, we only have one language for now. */ } + | NO_SYM SQL_SYM + { Lex->sp_chistics.daccess= SP_NO_SQL; } + | CONTAINS_SYM SQL_SYM + { Lex->sp_chistics.daccess= SP_CONTAINS_SQL; } + | READS_SYM SQL_SYM DATA_SYM + { Lex->sp_chistics.daccess= SP_READS_SQL_DATA; } + | MODIFIES_SYM SQL_SYM DATA_SYM + { Lex->sp_chistics.daccess= SP_MODIFIES_SQL_DATA; } + | sp_suid + {} + ; /* Create characteristics */ sp_c_chistic: - sp_chistic { } - | DETERMINISTIC_SYM { Lex->sp_chistics.detistic= TRUE; } - | not DETERMINISTIC_SYM { Lex->sp_chistics.detistic= FALSE; } - ; + sp_chistic { } + | DETERMINISTIC_SYM { Lex->sp_chistics.detistic= TRUE; } + | not DETERMINISTIC_SYM { Lex->sp_chistics.detistic= FALSE; } + ; sp_suid: - SQL_SYM SECURITY_SYM DEFINER_SYM - { - Lex->sp_chistics.suid= SP_IS_SUID; - } - | SQL_SYM SECURITY_SYM INVOKER_SYM - { - Lex->sp_chistics.suid= SP_IS_NOT_SUID; - } - ; + SQL_SYM SECURITY_SYM DEFINER_SYM + { + Lex->sp_chistics.suid= SP_IS_SUID; + } + | SQL_SYM SECURITY_SYM INVOKER_SYM + { + Lex->sp_chistics.suid= SP_IS_NOT_SUID; + } + ; call: - CALL_SYM sp_name - { - LEX *lex = Lex; + CALL_SYM sp_name + { + LEX *lex = Lex; - lex->sql_command= SQLCOM_CALL; - lex->spname= $2; - lex->value_list.empty(); - sp_add_used_routine(lex, YYTHD, $2, TYPE_ENUM_PROCEDURE); - } + lex->sql_command= SQLCOM_CALL; + lex->spname= $2; + lex->value_list.empty(); + sp_add_used_routine(lex, YYTHD, $2, TYPE_ENUM_PROCEDURE); + } opt_sp_cparam_list {} - ; + ; /* CALL parameters */ opt_sp_cparam_list: - /* Empty */ - | '(' opt_sp_cparams ')' - ; + /* Empty */ + | '(' opt_sp_cparams ')' + ; opt_sp_cparams: /* Empty */ @@ -2201,58 +2237,58 @@ opt_sp_cparams: ; sp_cparams: - sp_cparams ',' expr - { - Lex->value_list.push_back($3); - } - | expr - { - Lex->value_list.push_back($1); - } - ; + sp_cparams ',' expr + { + Lex->value_list.push_back($3); + } + | expr + { + Lex->value_list.push_back($1); + } + ; /* Stored FUNCTION parameter declaration list */ sp_fdparam_list: - /* Empty */ - | sp_fdparams - ; + /* Empty */ + | sp_fdparams + ; sp_fdparams: - sp_fdparams ',' sp_fdparam - | sp_fdparam - ; + sp_fdparams ',' sp_fdparam + | sp_fdparam + ; sp_init_param: - /* Empty */ - { - LEX *lex= Lex; + /* Empty */ + { + LEX *lex= Lex; - lex->length= 0; - lex->dec= 0; - lex->type= 0; - - lex->default_value= 0; - lex->on_update_value= 0; - - lex->comment= null_lex_str; - lex->charset= NULL; - - lex->interval_list.empty(); - lex->uint_geom_type= 0; - } - ; + lex->length= 0; + lex->dec= 0; + lex->type= 0; + + lex->default_value= 0; + lex->on_update_value= 0; + + lex->comment= null_lex_str; + lex->charset= NULL; + + lex->interval_list.empty(); + lex->uint_geom_type= 0; + } + ; sp_fdparam: - ident sp_init_param type - { - LEX *lex= Lex; - sp_pcontext *spc= lex->spcont; + ident sp_init_param type + { + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; - if (spc->find_variable(&$1, TRUE)) - { - my_error(ER_SP_DUP_PARAM, MYF(0), $1.str); - MYSQL_YYABORT; - } + if (spc->find_variable(&$1, TRUE)) + { + my_error(ER_SP_DUP_PARAM, MYF(0), $1.str); + MYSQL_YYABORT; + } sp_variable_t *spvar= spc->push_variable(&$1, (enum enum_field_types)$3, sp_param_in); @@ -2265,31 +2301,31 @@ sp_fdparam: } spvar->field_def.field_name= spvar->name.str; spvar->field_def.pack_flag |= FIELDFLAG_MAYBE_NULL; - } - ; + } + ; /* Stored PROCEDURE parameter declaration list */ sp_pdparam_list: - /* Empty */ - | sp_pdparams - ; + /* Empty */ + | sp_pdparams + ; sp_pdparams: - sp_pdparams ',' sp_pdparam - | sp_pdparam - ; + sp_pdparams ',' sp_pdparam + | sp_pdparam + ; sp_pdparam: - sp_opt_inout sp_init_param ident type - { - LEX *lex= Lex; - sp_pcontext *spc= lex->spcont; + sp_opt_inout sp_init_param ident type + { + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; - if (spc->find_variable(&$3, TRUE)) - { - my_error(ER_SP_DUP_PARAM, MYF(0), $3.str); - MYSQL_YYABORT; - } + if (spc->find_variable(&$3, TRUE)) + { + my_error(ER_SP_DUP_PARAM, MYF(0), $3.str); + MYSQL_YYABORT; + } sp_variable_t *spvar= spc->push_variable(&$3, (enum enum_field_types)$4, (sp_param_mode_t)$1); @@ -2302,55 +2338,55 @@ sp_pdparam: } spvar->field_def.field_name= spvar->name.str; spvar->field_def.pack_flag |= FIELDFLAG_MAYBE_NULL; - } - ; + } + ; sp_opt_inout: - /* Empty */ { $$= sp_param_in; } - | IN_SYM { $$= sp_param_in; } - | OUT_SYM { $$= sp_param_out; } - | INOUT_SYM { $$= sp_param_inout; } - ; + /* Empty */ { $$= sp_param_in; } + | IN_SYM { $$= sp_param_in; } + | OUT_SYM { $$= sp_param_out; } + | INOUT_SYM { $$= sp_param_inout; } + ; sp_proc_stmts: - /* Empty */ {} - | sp_proc_stmts sp_proc_stmt ';' - ; + /* Empty */ {} + | sp_proc_stmts sp_proc_stmt ';' + ; sp_proc_stmts1: - sp_proc_stmt ';' {} - | sp_proc_stmts1 sp_proc_stmt ';' - ; + sp_proc_stmt ';' {} + | sp_proc_stmts1 sp_proc_stmt ';' + ; sp_decls: - /* Empty */ - { - $$.vars= $$.conds= $$.hndlrs= $$.curs= 0; - } - | sp_decls sp_decl ';' - { - /* We check for declarations out of (standard) order this way - because letting the grammar rules reflect it caused tricky - shift/reduce conflicts with the wrong result. (And we get - better error handling this way.) */ - if (($2.vars || $2.conds) && ($1.curs || $1.hndlrs)) - { /* Variable or condition following cursor or handler */ - my_message(ER_SP_VARCOND_AFTER_CURSHNDLR, + /* Empty */ + { + $$.vars= $$.conds= $$.hndlrs= $$.curs= 0; + } + | sp_decls sp_decl ';' + { + /* We check for declarations out of (standard) order this way + because letting the grammar rules reflect it caused tricky + shift/reduce conflicts with the wrong result. (And we get + better error handling this way.) */ + if (($2.vars || $2.conds) && ($1.curs || $1.hndlrs)) + { /* Variable or condition following cursor or handler */ + my_message(ER_SP_VARCOND_AFTER_CURSHNDLR, ER(ER_SP_VARCOND_AFTER_CURSHNDLR), MYF(0)); - MYSQL_YYABORT; - } - if ($2.curs && $1.hndlrs) - { /* Cursor following handler */ - my_message(ER_SP_CURSOR_AFTER_HANDLER, + MYSQL_YYABORT; + } + if ($2.curs && $1.hndlrs) + { /* Cursor following handler */ + my_message(ER_SP_CURSOR_AFTER_HANDLER, ER(ER_SP_CURSOR_AFTER_HANDLER), MYF(0)); - MYSQL_YYABORT; - } - $$.vars= $1.vars + $2.vars; - $$.conds= $1.conds + $2.conds; - $$.hndlrs= $1.hndlrs + $2.hndlrs; - $$.curs= $1.curs + $2.curs; - } - ; + MYSQL_YYABORT; + } + $$.vars= $1.vars + $2.vars; + $$.conds= $1.conds + $2.conds; + $$.hndlrs= $1.hndlrs + $2.hndlrs; + $$.curs= $1.curs + $2.curs; + } + ; sp_decl: DECLARE_SYM sp_decl_idents @@ -2409,126 +2445,126 @@ sp_decl: $$.vars= $2; $$.conds= $$.hndlrs= $$.curs= 0; } - | DECLARE_SYM ident CONDITION_SYM FOR_SYM sp_cond - { - LEX *lex= Lex; - sp_pcontext *spc= lex->spcont; + | DECLARE_SYM ident CONDITION_SYM FOR_SYM sp_cond + { + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; - if (spc->find_cond(&$2, TRUE)) - { - my_error(ER_SP_DUP_COND, MYF(0), $2.str); - MYSQL_YYABORT; - } - YYTHD->lex->spcont->push_cond(&$2, $5); - $$.vars= $$.hndlrs= $$.curs= 0; - $$.conds= 1; - } - | DECLARE_SYM sp_handler_type HANDLER_SYM FOR_SYM - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; + if (spc->find_cond(&$2, TRUE)) + { + my_error(ER_SP_DUP_COND, MYF(0), $2.str); + MYSQL_YYABORT; + } + YYTHD->lex->spcont->push_cond(&$2, $5); + $$.vars= $$.hndlrs= $$.curs= 0; + $$.conds= 1; + } + | DECLARE_SYM sp_handler_type HANDLER_SYM FOR_SYM + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; lex->spcont= lex->spcont->push_context(LABEL_HANDLER_SCOPE); - sp_pcontext *ctx= lex->spcont; - sp_instr_hpush_jump *i= + sp_pcontext *ctx= lex->spcont; + sp_instr_hpush_jump *i= new sp_instr_hpush_jump(sp->instructions(), ctx, $2, - ctx->current_var_count()); + ctx->current_var_count()); - sp->add_instr(i); - sp->push_backpatch(i, ctx->push_label((char *)"", 0)); - } - sp_hcond_list sp_proc_stmt - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - sp_pcontext *ctx= lex->spcont; - sp_label_t *hlab= lex->spcont->pop_label(); /* After this hdlr */ - sp_instr_hreturn *i; + sp->add_instr(i); + sp->push_backpatch(i, ctx->push_label((char *)"", 0)); + } + sp_hcond_list sp_proc_stmt + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *ctx= lex->spcont; + sp_label_t *hlab= lex->spcont->pop_label(); /* After this hdlr */ + sp_instr_hreturn *i; - if ($2 == SP_HANDLER_CONTINUE) - { - i= new sp_instr_hreturn(sp->instructions(), ctx, - ctx->current_var_count()); - sp->add_instr(i); - } - else - { /* EXIT or UNDO handler, just jump to the end of the block */ - i= new sp_instr_hreturn(sp->instructions(), ctx, 0); + if ($2 == SP_HANDLER_CONTINUE) + { + i= new sp_instr_hreturn(sp->instructions(), ctx, + ctx->current_var_count()); + sp->add_instr(i); + } + else + { /* EXIT or UNDO handler, just jump to the end of the block */ + i= new sp_instr_hreturn(sp->instructions(), ctx, 0); - sp->add_instr(i); - sp->push_backpatch(i, lex->spcont->last_label()); /* Block end */ - } - lex->sphead->backpatch(hlab); + sp->add_instr(i); + sp->push_backpatch(i, lex->spcont->last_label()); /* Block end */ + } + lex->sphead->backpatch(hlab); lex->spcont= ctx->pop_context(); - $$.vars= $$.conds= $$.curs= 0; - $$.hndlrs= $6; - lex->spcont->add_handlers($6); - } - | DECLARE_SYM ident CURSOR_SYM FOR_SYM sp_cursor_stmt - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - sp_pcontext *ctx= lex->spcont; - uint offp; - sp_instr_cpush *i; + $$.vars= $$.conds= $$.curs= 0; + $$.hndlrs= $6; + lex->spcont->add_handlers($6); + } + | DECLARE_SYM ident CURSOR_SYM FOR_SYM sp_cursor_stmt + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *ctx= lex->spcont; + uint offp; + sp_instr_cpush *i; - if (ctx->find_cursor(&$2, &offp, TRUE)) - { - my_error(ER_SP_DUP_CURS, MYF(0), $2.str); - delete $5; - MYSQL_YYABORT; - } + if (ctx->find_cursor(&$2, &offp, TRUE)) + { + my_error(ER_SP_DUP_CURS, MYF(0), $2.str); + delete $5; + MYSQL_YYABORT; + } i= new sp_instr_cpush(sp->instructions(), ctx, $5, ctx->current_cursor_count()); - sp->add_instr(i); - ctx->push_cursor(&$2); - $$.vars= $$.conds= $$.hndlrs= 0; - $$.curs= 1; - } - ; + sp->add_instr(i); + ctx->push_cursor(&$2); + $$.vars= $$.conds= $$.hndlrs= 0; + $$.curs= 1; + } + ; sp_cursor_stmt: - { - Lex->sphead->reset_lex(YYTHD); + { + Lex->sphead->reset_lex(YYTHD); - /* - We use statement here just be able to get a better - error message. Using 'select' works too, but will then - result in a generic "syntax error" if a non-select - statement is given. - */ - } - statement - { - LEX *lex= Lex; + /* + We use statement here just be able to get a better + error message. Using 'select' works too, but will then + result in a generic "syntax error" if a non-select + statement is given. + */ + } + statement + { + LEX *lex= Lex; - if (lex->sql_command != SQLCOM_SELECT && - !(sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND)) - { - my_message(ER_SP_BAD_CURSOR_QUERY, ER(ER_SP_BAD_CURSOR_QUERY), + if (lex->sql_command != SQLCOM_SELECT && + !(sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND)) + { + my_message(ER_SP_BAD_CURSOR_QUERY, ER(ER_SP_BAD_CURSOR_QUERY), MYF(0)); - MYSQL_YYABORT; - } - if (lex->result) - { - my_message(ER_SP_BAD_CURSOR_SELECT, ER(ER_SP_BAD_CURSOR_SELECT), + MYSQL_YYABORT; + } + if (lex->result) + { + my_message(ER_SP_BAD_CURSOR_SELECT, ER(ER_SP_BAD_CURSOR_SELECT), MYF(0)); - MYSQL_YYABORT; - } - lex->sp_lex_in_use= TRUE; - $$= lex; - lex->sphead->restore_lex(YYTHD); - } - ; + MYSQL_YYABORT; + } + lex->sp_lex_in_use= TRUE; + $$= lex; + lex->sphead->restore_lex(YYTHD); + } + ; sp_handler_type: - EXIT_SYM { $$= SP_HANDLER_EXIT; } - | CONTINUE_SYM { $$= SP_HANDLER_CONTINUE; } -/* | UNDO_SYM { QQ No yet } */ - ; + EXIT_SYM { $$= SP_HANDLER_EXIT; } + | CONTINUE_SYM { $$= SP_HANDLER_CONTINUE; } + /*| UNDO_SYM { QQ No yet } */ + ; sp_hcond_list: sp_hcond_element @@ -2538,174 +2574,175 @@ sp_hcond_list: ; sp_hcond_element: - sp_hcond - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - sp_pcontext *ctx= lex->spcont->parent_context(); + sp_hcond + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *ctx= lex->spcont->parent_context(); - if (ctx->find_handler($1)) - { - my_message(ER_SP_DUP_HANDLER, ER(ER_SP_DUP_HANDLER), MYF(0)); - MYSQL_YYABORT; - } - else - { - sp_instr_hpush_jump *i= + if (ctx->find_handler($1)) + { + my_message(ER_SP_DUP_HANDLER, ER(ER_SP_DUP_HANDLER), MYF(0)); + MYSQL_YYABORT; + } + else + { + sp_instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction(); - i->add_condition($1); - ctx->push_handler($1); - } - } - ; + i->add_condition($1); + ctx->push_handler($1); + } + } + ; sp_cond: - ulong_num - { /* mysql errno */ - $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t)); - $$->type= sp_cond_type_t::number; - $$->mysqlerr= $1; - } - | SQLSTATE_SYM opt_value TEXT_STRING_literal - { /* SQLSTATE */ - if (!sp_cond_check(&$3)) - { - my_error(ER_SP_BAD_SQLSTATE, MYF(0), $3.str); - MYSQL_YYABORT; - } - $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t)); - $$->type= sp_cond_type_t::state; - memcpy($$->sqlstate, $3.str, 5); - $$->sqlstate[5]= '\0'; - } - ; + ulong_num + { /* mysql errno */ + $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t)); + $$->type= sp_cond_type_t::number; + $$->mysqlerr= $1; + } + | SQLSTATE_SYM opt_value TEXT_STRING_literal + { /* SQLSTATE */ + if (!sp_cond_check(&$3)) + { + my_error(ER_SP_BAD_SQLSTATE, MYF(0), $3.str); + MYSQL_YYABORT; + } + $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t)); + $$->type= sp_cond_type_t::state; + memcpy($$->sqlstate, $3.str, 5); + $$->sqlstate[5]= '\0'; + } + ; opt_value: - /* Empty */ {} - | VALUE_SYM {} - ; + /* Empty */ {} + | VALUE_SYM {} + ; sp_hcond: - sp_cond - { - $$= $1; - } - | ident /* CONDITION name */ - { - $$= Lex->spcont->find_cond(&$1); - if ($$ == NULL) - { - my_error(ER_SP_COND_MISMATCH, MYF(0), $1.str); - MYSQL_YYABORT; - } - } - | SQLWARNING_SYM /* SQLSTATEs 01??? */ - { - $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t)); - $$->type= sp_cond_type_t::warning; - } - | not FOUND_SYM /* SQLSTATEs 02??? */ - { - $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t)); - $$->type= sp_cond_type_t::notfound; - } - | SQLEXCEPTION_SYM /* All other SQLSTATEs */ - { - $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t)); - $$->type= sp_cond_type_t::exception; - } - ; + sp_cond + { + $$= $1; + } + | ident /* CONDITION name */ + { + $$= Lex->spcont->find_cond(&$1); + if ($$ == NULL) + { + my_error(ER_SP_COND_MISMATCH, MYF(0), $1.str); + MYSQL_YYABORT; + } + } + | SQLWARNING_SYM /* SQLSTATEs 01??? */ + { + $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t)); + $$->type= sp_cond_type_t::warning; + } + | not FOUND_SYM /* SQLSTATEs 02??? */ + { + $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t)); + $$->type= sp_cond_type_t::notfound; + } + | SQLEXCEPTION_SYM /* All other SQLSTATEs */ + { + $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t)); + $$->type= sp_cond_type_t::exception; + } + ; sp_decl_idents: - ident - { + ident + { /* NOTE: field definition is filled in sp_decl section. */ - LEX *lex= Lex; - sp_pcontext *spc= lex->spcont; + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; - if (spc->find_variable(&$1, TRUE)) - { - my_error(ER_SP_DUP_VAR, MYF(0), $1.str); - MYSQL_YYABORT; - } - spc->push_variable(&$1, (enum_field_types)0, sp_param_in); - $$= 1; - } - | sp_decl_idents ',' ident - { + if (spc->find_variable(&$1, TRUE)) + { + my_error(ER_SP_DUP_VAR, MYF(0), $1.str); + MYSQL_YYABORT; + } + spc->push_variable(&$1, (enum_field_types)0, sp_param_in); + $$= 1; + } + | sp_decl_idents ',' ident + { /* NOTE: field definition is filled in sp_decl section. */ - LEX *lex= Lex; - sp_pcontext *spc= lex->spcont; + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; - if (spc->find_variable(&$3, TRUE)) - { - my_error(ER_SP_DUP_VAR, MYF(0), $3.str); - MYSQL_YYABORT; - } - spc->push_variable(&$3, (enum_field_types)0, sp_param_in); - $$= $1 + 1; - } - ; + if (spc->find_variable(&$3, TRUE)) + { + my_error(ER_SP_DUP_VAR, MYF(0), $3.str); + MYSQL_YYABORT; + } + spc->push_variable(&$3, (enum_field_types)0, sp_param_in); + $$= $1 + 1; + } + ; sp_opt_default: - /* Empty */ { $$ = NULL; } + /* Empty */ { $$ = NULL; } | DEFAULT expr { $$ = $2; } - ; + ; sp_proc_stmt: - sp_proc_stmt_statement + sp_proc_stmt_statement | sp_proc_stmt_return - | sp_proc_stmt_if - | case_stmt_specification - | sp_labeled_control - | sp_proc_stmt_unlabeled - | sp_proc_stmt_leave - | sp_proc_stmt_iterate - | sp_proc_stmt_open - | sp_proc_stmt_fetch + | sp_proc_stmt_if + | case_stmt_specification + | sp_labeled_control + | sp_proc_stmt_unlabeled + | sp_proc_stmt_leave + | sp_proc_stmt_iterate + | sp_proc_stmt_open + | sp_proc_stmt_fetch | sp_proc_stmt_close ; sp_proc_stmt_if: - IF { Lex->sphead->new_cont_backpatch(NULL); } - sp_if END IF - { Lex->sphead->do_cont_backpatch(); } + IF + { Lex->sphead->new_cont_backpatch(NULL); } + sp_if END IF + { Lex->sphead->do_cont_backpatch(); } ; sp_proc_stmt_statement: - { + { THD *thd= YYTHD; LEX *lex= thd->lex; Lex_input_stream *lip= thd->m_lip; - lex->sphead->reset_lex(thd); + lex->sphead->reset_lex(thd); lex->sphead->m_tmp_query= lip->get_tok_start(); - } - statement - { + } + statement + { THD *thd= YYTHD; LEX *lex= thd->lex; Lex_input_stream *lip= thd->m_lip; - sp_head *sp= lex->sphead; + sp_head *sp= lex->sphead; sp->m_flags|= sp_get_flags_for_command(lex); - if (lex->sql_command == SQLCOM_CHANGE_DB) - { /* "USE db" doesn't work in a procedure */ - my_error(ER_SP_BADSTATEMENT, MYF(0), "USE"); - MYSQL_YYABORT; - } - /* + if (lex->sql_command == SQLCOM_CHANGE_DB) + { /* "USE db" doesn't work in a procedure */ + my_error(ER_SP_BADSTATEMENT, MYF(0), "USE"); + MYSQL_YYABORT; + } + /* Don't add an instruction for SET statements, since all instructions for them were already added during processing of "set" rule. - */ + */ DBUG_ASSERT(lex->sql_command != SQLCOM_SET_OPTION || lex->var_list.is_empty()); if (lex->sql_command != SQLCOM_SET_OPTION) - { + { sp_instr_stmt *i=new sp_instr_stmt(sp->instructions(), lex->spcont, lex); @@ -2723,259 +2760,258 @@ sp_proc_stmt_statement: i->m_query.length); sp->add_instr(i); } - sp->restore_lex(thd); + sp->restore_lex(thd); } ; sp_proc_stmt_return: - RETURN_SYM + RETURN_SYM { Lex->sphead->reset_lex(YYTHD); } expr - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; - if (sp->m_type != TYPE_ENUM_FUNCTION) - { - my_message(ER_SP_BADRETURN, ER(ER_SP_BADRETURN), MYF(0)); - MYSQL_YYABORT; - } - else - { - sp_instr_freturn *i; + if (sp->m_type != TYPE_ENUM_FUNCTION) + { + my_message(ER_SP_BADRETURN, ER(ER_SP_BADRETURN), MYF(0)); + MYSQL_YYABORT; + } + else + { + sp_instr_freturn *i; - i= new sp_instr_freturn(sp->instructions(), lex->spcont, $3, + i= new sp_instr_freturn(sp->instructions(), lex->spcont, $3, sp->m_return_field_def.sql_type, lex); - sp->add_instr(i); - sp->m_flags|= sp_head::HAS_RETURN; - } - sp->restore_lex(YYTHD); - } + sp->add_instr(i); + sp->m_flags|= sp_head::HAS_RETURN; + } + sp->restore_lex(YYTHD); + } ; sp_proc_stmt_unlabeled: - { /* Unlabeled controls get a secret label. */ - LEX *lex= Lex; + { /* Unlabeled controls get a secret label. */ + LEX *lex= Lex; - lex->spcont->push_label((char *)"", lex->sphead->instructions()); - } - sp_unlabeled_control - { - LEX *lex= Lex; + lex->spcont->push_label((char *)"", lex->sphead->instructions()); + } + sp_unlabeled_control + { + LEX *lex= Lex; - lex->sphead->backpatch(lex->spcont->pop_label()); - } + lex->sphead->backpatch(lex->spcont->pop_label()); + } ; sp_proc_stmt_leave: - LEAVE_SYM label_ident - { - LEX *lex= Lex; - sp_head *sp = lex->sphead; - sp_pcontext *ctx= lex->spcont; - sp_label_t *lab= ctx->find_label($2.str); + LEAVE_SYM label_ident + { + LEX *lex= Lex; + sp_head *sp = lex->sphead; + sp_pcontext *ctx= lex->spcont; + sp_label_t *lab= ctx->find_label($2.str); - if (! lab) - { - my_error(ER_SP_LILABEL_MISMATCH, MYF(0), "LEAVE", $2.str); - MYSQL_YYABORT; - } - else - { - sp_instr_jump *i; - uint ip= sp->instructions(); - uint n; + if (! lab) + { + my_error(ER_SP_LILABEL_MISMATCH, MYF(0), "LEAVE", $2.str); + MYSQL_YYABORT; + } + else + { + sp_instr_jump *i; + uint ip= sp->instructions(); + uint n; - n= ctx->diff_handlers(lab->ctx, TRUE); /* Exclusive the dest. */ - if (n) - sp->add_instr(new sp_instr_hpop(ip++, ctx, n)); - n= ctx->diff_cursors(lab->ctx, TRUE); /* Exclusive the dest. */ - if (n) - sp->add_instr(new sp_instr_cpop(ip++, ctx, n)); - i= new sp_instr_jump(ip, ctx); - sp->push_backpatch(i, lab); /* Jumping forward */ + n= ctx->diff_handlers(lab->ctx, TRUE); /* Exclusive the dest. */ + if (n) + sp->add_instr(new sp_instr_hpop(ip++, ctx, n)); + n= ctx->diff_cursors(lab->ctx, TRUE); /* Exclusive the dest. */ + if (n) + sp->add_instr(new sp_instr_cpop(ip++, ctx, n)); + i= new sp_instr_jump(ip, ctx); + sp->push_backpatch(i, lab); /* Jumping forward */ sp->add_instr(i); - } - } + } + } ; sp_proc_stmt_iterate: - ITERATE_SYM label_ident - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - sp_pcontext *ctx= lex->spcont; - sp_label_t *lab= ctx->find_label($2.str); + ITERATE_SYM label_ident + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *ctx= lex->spcont; + sp_label_t *lab= ctx->find_label($2.str); - if (! lab || lab->type != SP_LAB_ITER) - { - my_error(ER_SP_LILABEL_MISMATCH, MYF(0), "ITERATE", $2.str); - MYSQL_YYABORT; - } - else - { - sp_instr_jump *i; - uint ip= sp->instructions(); - uint n; + if (! lab || lab->type != SP_LAB_ITER) + { + my_error(ER_SP_LILABEL_MISMATCH, MYF(0), "ITERATE", $2.str); + MYSQL_YYABORT; + } + else + { + sp_instr_jump *i; + uint ip= sp->instructions(); + uint n; - n= ctx->diff_handlers(lab->ctx, FALSE); /* Inclusive the dest. */ - if (n) - sp->add_instr(new sp_instr_hpop(ip++, ctx, n)); - n= ctx->diff_cursors(lab->ctx, FALSE); /* Inclusive the dest. */ - if (n) - sp->add_instr(new sp_instr_cpop(ip++, ctx, n)); - i= new sp_instr_jump(ip, ctx, lab->ip); /* Jump back */ + n= ctx->diff_handlers(lab->ctx, FALSE); /* Inclusive the dest. */ + if (n) + sp->add_instr(new sp_instr_hpop(ip++, ctx, n)); + n= ctx->diff_cursors(lab->ctx, FALSE); /* Inclusive the dest. */ + if (n) + sp->add_instr(new sp_instr_cpop(ip++, ctx, n)); + i= new sp_instr_jump(ip, ctx, lab->ip); /* Jump back */ sp->add_instr(i); - } - } + } + } ; sp_proc_stmt_open: - OPEN_SYM ident - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - uint offset; - sp_instr_copen *i; + OPEN_SYM ident + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + uint offset; + sp_instr_copen *i; - if (! lex->spcont->find_cursor(&$2, &offset)) - { - my_error(ER_SP_CURSOR_MISMATCH, MYF(0), $2.str); - MYSQL_YYABORT; - } - i= new sp_instr_copen(sp->instructions(), lex->spcont, offset); - sp->add_instr(i); - } + if (! lex->spcont->find_cursor(&$2, &offset)) + { + my_error(ER_SP_CURSOR_MISMATCH, MYF(0), $2.str); + MYSQL_YYABORT; + } + i= new sp_instr_copen(sp->instructions(), lex->spcont, offset); + sp->add_instr(i); + } ; sp_proc_stmt_fetch: - FETCH_SYM sp_opt_fetch_noise ident INTO - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - uint offset; - sp_instr_cfetch *i; + FETCH_SYM sp_opt_fetch_noise ident INTO + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + uint offset; + sp_instr_cfetch *i; - if (! lex->spcont->find_cursor(&$3, &offset)) - { - my_error(ER_SP_CURSOR_MISMATCH, MYF(0), $3.str); - MYSQL_YYABORT; - } - i= new sp_instr_cfetch(sp->instructions(), lex->spcont, offset); - sp->add_instr(i); - } - sp_fetch_list - { } + if (! lex->spcont->find_cursor(&$3, &offset)) + { + my_error(ER_SP_CURSOR_MISMATCH, MYF(0), $3.str); + MYSQL_YYABORT; + } + i= new sp_instr_cfetch(sp->instructions(), lex->spcont, offset); + sp->add_instr(i); + } + sp_fetch_list + {} ; sp_proc_stmt_close: - CLOSE_SYM ident - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - uint offset; - sp_instr_cclose *i; + CLOSE_SYM ident + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + uint offset; + sp_instr_cclose *i; - if (! lex->spcont->find_cursor(&$2, &offset)) - { - my_error(ER_SP_CURSOR_MISMATCH, MYF(0), $2.str); - MYSQL_YYABORT; - } - i= new sp_instr_cclose(sp->instructions(), lex->spcont, offset); - sp->add_instr(i); - } - ; + if (! lex->spcont->find_cursor(&$2, &offset)) + { + my_error(ER_SP_CURSOR_MISMATCH, MYF(0), $2.str); + MYSQL_YYABORT; + } + i= new sp_instr_cclose(sp->instructions(), lex->spcont, offset); + sp->add_instr(i); + } + ; sp_opt_fetch_noise: - /* Empty */ - | NEXT_SYM FROM - | FROM - ; + /* Empty */ + | NEXT_SYM FROM + | FROM + ; sp_fetch_list: - ident - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - sp_pcontext *spc= lex->spcont; - sp_variable_t *spv; + ident + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *spc= lex->spcont; + sp_variable_t *spv; - if (!spc || !(spv = spc->find_variable(&$1))) - { - my_error(ER_SP_UNDECLARED_VAR, MYF(0), $1.str); - MYSQL_YYABORT; - } - else - { - /* An SP local variable */ - sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); + if (!spc || !(spv = spc->find_variable(&$1))) + { + my_error(ER_SP_UNDECLARED_VAR, MYF(0), $1.str); + MYSQL_YYABORT; + } + else + { + /* An SP local variable */ + sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); - i->add_to_varlist(spv); - } - } - | - sp_fetch_list ',' ident - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - sp_pcontext *spc= lex->spcont; - sp_variable_t *spv; + i->add_to_varlist(spv); + } + } + | sp_fetch_list ',' ident + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *spc= lex->spcont; + sp_variable_t *spv; - if (!spc || !(spv = spc->find_variable(&$3))) - { - my_error(ER_SP_UNDECLARED_VAR, MYF(0), $3.str); - MYSQL_YYABORT; - } - else - { - /* An SP local variable */ - sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); + if (!spc || !(spv = spc->find_variable(&$3))) + { + my_error(ER_SP_UNDECLARED_VAR, MYF(0), $3.str); + MYSQL_YYABORT; + } + else + { + /* An SP local variable */ + sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); - i->add_to_varlist(spv); - } - } - ; + i->add_to_varlist(spv); + } + } + ; sp_if: { Lex->sphead->reset_lex(YYTHD); } expr THEN_SYM - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - sp_pcontext *ctx= lex->spcont; - uint ip= sp->instructions(); - sp_instr_jump_if_not *i = new sp_instr_jump_if_not(ip, ctx, + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *ctx= lex->spcont; + uint ip= sp->instructions(); + sp_instr_jump_if_not *i = new sp_instr_jump_if_not(ip, ctx, $2, lex); - sp->push_backpatch(i, ctx->push_label((char *)"", 0)); + sp->push_backpatch(i, ctx->push_label((char *)"", 0)); sp->add_cont_backpatch(i); sp->add_instr(i); sp->restore_lex(YYTHD); - } - sp_proc_stmts1 - { - sp_head *sp= Lex->sphead; - sp_pcontext *ctx= Lex->spcont; - uint ip= sp->instructions(); - sp_instr_jump *i = new sp_instr_jump(ip, ctx); + } + sp_proc_stmts1 + { + sp_head *sp= Lex->sphead; + sp_pcontext *ctx= Lex->spcont; + uint ip= sp->instructions(); + sp_instr_jump *i = new sp_instr_jump(ip, ctx); - sp->add_instr(i); - sp->backpatch(ctx->pop_label()); - sp->push_backpatch(i, ctx->push_label((char *)"", 0)); - } - sp_elseifs - { - LEX *lex= Lex; + sp->add_instr(i); + sp->backpatch(ctx->pop_label()); + sp->push_backpatch(i, ctx->push_label((char *)"", 0)); + } + sp_elseifs + { + LEX *lex= Lex; - lex->sphead->backpatch(lex->spcont->pop_label()); - } - ; + lex->sphead->backpatch(lex->spcont->pop_label()); + } + ; sp_elseifs: - /* Empty */ - | ELSEIF_SYM sp_if - | ELSE sp_proc_stmts1 - ; + /* Empty */ + | ELSEIF_SYM sp_if + | ELSE sp_proc_stmts1 + ; case_stmt_specification: simple_case_stmt @@ -3087,138 +3123,138 @@ else_clause_opt: ; sp_labeled_control: - label_ident ':' - { - LEX *lex= Lex; - sp_pcontext *ctx= lex->spcont; - sp_label_t *lab= ctx->find_label($1.str); + label_ident ':' + { + LEX *lex= Lex; + sp_pcontext *ctx= lex->spcont; + sp_label_t *lab= ctx->find_label($1.str); - if (lab) - { - my_error(ER_SP_LABEL_REDEFINE, MYF(0), $1.str); - MYSQL_YYABORT; - } - else - { - lab= lex->spcont->push_label($1.str, - lex->sphead->instructions()); - lab->type= SP_LAB_ITER; - } - } - sp_unlabeled_control sp_opt_label - { - LEX *lex= Lex; + if (lab) + { + my_error(ER_SP_LABEL_REDEFINE, MYF(0), $1.str); + MYSQL_YYABORT; + } + else + { + lab= lex->spcont->push_label($1.str, + lex->sphead->instructions()); + lab->type= SP_LAB_ITER; + } + } + sp_unlabeled_control sp_opt_label + { + LEX *lex= Lex; - if ($5.str) - { - sp_label_t *lab= lex->spcont->find_label($5.str); + if ($5.str) + { + sp_label_t *lab= lex->spcont->find_label($5.str); - if (!lab || - my_strcasecmp(system_charset_info, $5.str, lab->name) != 0) - { - my_error(ER_SP_LABEL_MISMATCH, MYF(0), $5.str); - MYSQL_YYABORT; - } - } - lex->sphead->backpatch(lex->spcont->pop_label()); - } - ; + if (!lab || + my_strcasecmp(system_charset_info, $5.str, lab->name) != 0) + { + my_error(ER_SP_LABEL_MISMATCH, MYF(0), $5.str); + MYSQL_YYABORT; + } + } + lex->sphead->backpatch(lex->spcont->pop_label()); + } + ; sp_opt_label: - /* Empty */ { $$= null_lex_str; } + /* Empty */ { $$= null_lex_str; } | label_ident { $$= $1; } - ; + ; sp_unlabeled_control: - BEGIN_SYM - { /* QQ This is just a dummy for grouping declarations and statements - together. No [[NOT] ATOMIC] yet, and we need to figure out how - make it coexist with the existing BEGIN COMMIT/ROLLBACK. */ - LEX *lex= Lex; - sp_label_t *lab= lex->spcont->last_label(); + BEGIN_SYM + { /* QQ This is just a dummy for grouping declarations and statements + together. No [[NOT] ATOMIC] yet, and we need to figure out how + make it coexist with the existing BEGIN COMMIT/ROLLBACK. */ + LEX *lex= Lex; + sp_label_t *lab= lex->spcont->last_label(); - lab->type= SP_LAB_BEGIN; - lex->spcont= lex->spcont->push_context(LABEL_DEFAULT_SCOPE); - } - sp_decls - sp_proc_stmts - END - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - sp_pcontext *ctx= lex->spcont; + lab->type= SP_LAB_BEGIN; + lex->spcont= lex->spcont->push_context(LABEL_DEFAULT_SCOPE); + } + sp_decls + sp_proc_stmts + END + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *ctx= lex->spcont; - sp->backpatch(ctx->last_label()); /* We always have a label */ - if ($3.hndlrs) - sp->add_instr(new sp_instr_hpop(sp->instructions(), ctx, - $3.hndlrs)); - if ($3.curs) - sp->add_instr(new sp_instr_cpop(sp->instructions(), ctx, - $3.curs)); - lex->spcont= ctx->pop_context(); - } - | LOOP_SYM - sp_proc_stmts1 END LOOP_SYM - { - LEX *lex= Lex; - uint ip= lex->sphead->instructions(); - sp_label_t *lab= lex->spcont->last_label(); /* Jumping back */ - sp_instr_jump *i = new sp_instr_jump(ip, lex->spcont, lab->ip); + sp->backpatch(ctx->last_label()); /* We always have a label */ + if ($3.hndlrs) + sp->add_instr(new sp_instr_hpop(sp->instructions(), ctx, + $3.hndlrs)); + if ($3.curs) + sp->add_instr(new sp_instr_cpop(sp->instructions(), ctx, + $3.curs)); + lex->spcont= ctx->pop_context(); + } + | LOOP_SYM + sp_proc_stmts1 END LOOP_SYM + { + LEX *lex= Lex; + uint ip= lex->sphead->instructions(); + sp_label_t *lab= lex->spcont->last_label(); /* Jumping back */ + sp_instr_jump *i = new sp_instr_jump(ip, lex->spcont, lab->ip); - lex->sphead->add_instr(i); - } + lex->sphead->add_instr(i); + } | WHILE_SYM { Lex->sphead->reset_lex(YYTHD); } expr DO_SYM - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - uint ip= sp->instructions(); - sp_instr_jump_if_not *i = new sp_instr_jump_if_not(ip, lex->spcont, - $3, lex); + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + uint ip= sp->instructions(); + sp_instr_jump_if_not *i = new sp_instr_jump_if_not(ip, lex->spcont, + $3, lex); - /* Jumping forward */ - sp->push_backpatch(i, lex->spcont->last_label()); + /* Jumping forward */ + sp->push_backpatch(i, lex->spcont->last_label()); sp->new_cont_backpatch(i); sp->add_instr(i); sp->restore_lex(YYTHD); - } - sp_proc_stmts1 END WHILE_SYM - { - LEX *lex= Lex; - uint ip= lex->sphead->instructions(); - sp_label_t *lab= lex->spcont->last_label(); /* Jumping back */ - sp_instr_jump *i = new sp_instr_jump(ip, lex->spcont, lab->ip); + } + sp_proc_stmts1 END WHILE_SYM + { + LEX *lex= Lex; + uint ip= lex->sphead->instructions(); + sp_label_t *lab= lex->spcont->last_label(); /* Jumping back */ + sp_instr_jump *i = new sp_instr_jump(ip, lex->spcont, lab->ip); - lex->sphead->add_instr(i); + lex->sphead->add_instr(i); lex->sphead->do_cont_backpatch(); - } + } | REPEAT_SYM sp_proc_stmts1 UNTIL_SYM { Lex->sphead->reset_lex(YYTHD); } expr END REPEAT_SYM - { - LEX *lex= Lex; - uint ip= lex->sphead->instructions(); - sp_label_t *lab= lex->spcont->last_label(); /* Jumping back */ - sp_instr_jump_if_not *i = new sp_instr_jump_if_not(ip, lex->spcont, + { + LEX *lex= Lex; + uint ip= lex->sphead->instructions(); + sp_label_t *lab= lex->spcont->last_label(); /* Jumping back */ + sp_instr_jump_if_not *i = new sp_instr_jump_if_not(ip, lex->spcont, $5, lab->ip, lex); lex->sphead->add_instr(i); lex->sphead->restore_lex(YYTHD); /* We can shortcut the cont_backpatch here */ i->m_cont_dest= ip+1; - } - ; + } + ; trg_action_time: - BEFORE_SYM + BEFORE_SYM { Lex->trg_chistics.action_time= TRG_ACTION_BEFORE; } - | AFTER_SYM + | AFTER_SYM { Lex->trg_chistics.action_time= TRG_ACTION_AFTER; } ; trg_event: - INSERT + INSERT { Lex->trg_chistics.event= TRG_EVENT_INSERT; } | UPDATE_SYM { Lex->trg_chistics.event= TRG_EVENT_UPDATE; } @@ -3241,156 +3277,157 @@ trg_event: change_tablespace_access: tablespace_name ts_access_mode - ; + ; change_tablespace_info: tablespace_name CHANGE ts_datafile change_ts_option_list - ; + ; tablespace_info: tablespace_name ADD ts_datafile opt_logfile_group_name tablespace_option_list - ; + ; opt_logfile_group_name: /* empty */ {} - | USE_SYM LOGFILE_SYM GROUP_SYM ident + | USE_SYM LOGFILE_SYM GROUP_SYM ident { LEX *lex= Lex; lex->alter_tablespace_info->logfile_group_name= $4.str; - }; + } + ; alter_tablespace_info: tablespace_name ADD ts_datafile - alter_tablespace_option_list - { - Lex->alter_tablespace_info->ts_alter_tablespace_type= ALTER_TABLESPACE_ADD_FILE; + alter_tablespace_option_list + { + Lex->alter_tablespace_info->ts_alter_tablespace_type= ALTER_TABLESPACE_ADD_FILE; } - | - tablespace_name + | tablespace_name DROP ts_datafile - alter_tablespace_option_list - { - Lex->alter_tablespace_info->ts_alter_tablespace_type= ALTER_TABLESPACE_DROP_FILE; - }; + alter_tablespace_option_list + { + Lex->alter_tablespace_info->ts_alter_tablespace_type= ALTER_TABLESPACE_DROP_FILE; + } + ; logfile_group_info: logfile_group_name add_log_file logfile_group_option_list - ; + ; alter_logfile_group_info: logfile_group_name add_log_file alter_logfile_group_option_list - ; + ; add_log_file: ADD lg_undofile - | ADD lg_redofile - ; + | ADD lg_redofile + ; change_ts_option_list: /* empty */ {} change_ts_options - ; + ; change_ts_options: change_ts_option - | change_ts_options change_ts_option - | change_ts_options ',' change_ts_option - ; + | change_ts_options change_ts_option + | change_ts_options ',' change_ts_option + ; change_ts_option: opt_ts_initial_size - | opt_ts_autoextend_size - | opt_ts_max_size - ; + | opt_ts_autoextend_size + | opt_ts_max_size + ; tablespace_option_list: /* empty */ {} - tablespace_options - ; + tablespace_options + ; tablespace_options: tablespace_option - | tablespace_options tablespace_option - | tablespace_options ',' tablespace_option - ; + | tablespace_options tablespace_option + | tablespace_options ',' tablespace_option + ; tablespace_option: opt_ts_initial_size - | opt_ts_autoextend_size - | opt_ts_max_size - | opt_ts_extent_size - | opt_ts_nodegroup - | opt_ts_engine - | ts_wait - | opt_ts_comment - ; + | opt_ts_autoextend_size + | opt_ts_max_size + | opt_ts_extent_size + | opt_ts_nodegroup + | opt_ts_engine + | ts_wait + | opt_ts_comment + ; alter_tablespace_option_list: /* empty */ {} - alter_tablespace_options - ; + alter_tablespace_options + ; alter_tablespace_options: alter_tablespace_option - | alter_tablespace_options alter_tablespace_option - | alter_tablespace_options ',' alter_tablespace_option - ; + | alter_tablespace_options alter_tablespace_option + | alter_tablespace_options ',' alter_tablespace_option + ; alter_tablespace_option: opt_ts_initial_size - | opt_ts_autoextend_size - | opt_ts_max_size - | opt_ts_engine - | ts_wait - ; + | opt_ts_autoextend_size + | opt_ts_max_size + | opt_ts_engine + | ts_wait + ; logfile_group_option_list: /* empty */ {} - logfile_group_options - ; + logfile_group_options + ; logfile_group_options: logfile_group_option - | logfile_group_options logfile_group_option - | logfile_group_options ',' logfile_group_option - ; + | logfile_group_options logfile_group_option + | logfile_group_options ',' logfile_group_option + ; logfile_group_option: opt_ts_initial_size - | opt_ts_undo_buffer_size - | opt_ts_redo_buffer_size - | opt_ts_nodegroup - | opt_ts_engine - | ts_wait - | opt_ts_comment - ; + | opt_ts_undo_buffer_size + | opt_ts_redo_buffer_size + | opt_ts_nodegroup + | opt_ts_engine + | ts_wait + | opt_ts_comment + ; alter_logfile_group_option_list: /* empty */ {} alter_logfile_group_options - ; + ; alter_logfile_group_options: alter_logfile_group_option - | alter_logfile_group_options alter_logfile_group_option - | alter_logfile_group_options ',' alter_logfile_group_option - ; + | alter_logfile_group_options alter_logfile_group_option + | alter_logfile_group_options ',' alter_logfile_group_option + ; alter_logfile_group_option: opt_ts_initial_size - | opt_ts_engine - | ts_wait - ; + | opt_ts_engine + | ts_wait + ; ts_datafile: @@ -3398,21 +3435,24 @@ ts_datafile: { LEX *lex= Lex; lex->alter_tablespace_info->data_file_name= $2.str; - }; + } + ; lg_undofile: UNDOFILE_SYM TEXT_STRING_sys { LEX *lex= Lex; lex->alter_tablespace_info->undo_file_name= $2.str; - }; + } + ; lg_redofile: REDOFILE_SYM TEXT_STRING_sys { LEX *lex= Lex; lex->alter_tablespace_info->redo_file_name= $2.str; - }; + } + ; tablespace_name: ident @@ -3421,7 +3461,8 @@ tablespace_name: lex->alter_tablespace_info= new st_alter_tablespace(); lex->alter_tablespace_info->tablespace_name= $1.str; lex->sql_command= SQLCOM_ALTER_TABLESPACE; - }; + } + ; logfile_group_name: ident @@ -3430,7 +3471,8 @@ logfile_group_name: lex->alter_tablespace_info= new st_alter_tablespace(); lex->alter_tablespace_info->logfile_group_name= $1.str; lex->sql_command= SQLCOM_ALTER_TABLESPACE; - }; + } + ; ts_access_mode: READ_ONLY_SYM @@ -3438,58 +3480,65 @@ ts_access_mode: LEX *lex= Lex; lex->alter_tablespace_info->ts_access_mode= TS_READ_ONLY; } - | READ_WRITE_SYM + | READ_WRITE_SYM { LEX *lex= Lex; lex->alter_tablespace_info->ts_access_mode= TS_READ_WRITE; } - | NOT_SYM ACCESSIBLE_SYM + | NOT_SYM ACCESSIBLE_SYM { LEX *lex= Lex; lex->alter_tablespace_info->ts_access_mode= TS_NOT_ACCESSIBLE; - }; + } + ; opt_ts_initial_size: INITIAL_SIZE_SYM opt_equal size_number { LEX *lex= Lex; lex->alter_tablespace_info->initial_size= $3; - }; + } + ; opt_ts_autoextend_size: AUTOEXTEND_SIZE_SYM opt_equal size_number { LEX *lex= Lex; lex->alter_tablespace_info->autoextend_size= $3; - }; + } + ; opt_ts_max_size: MAX_SIZE_SYM opt_equal size_number { LEX *lex= Lex; lex->alter_tablespace_info->max_size= $3; - }; + } + ; opt_ts_extent_size: EXTENT_SIZE_SYM opt_equal size_number { LEX *lex= Lex; lex->alter_tablespace_info->extent_size= $3; - }; + } + ; opt_ts_undo_buffer_size: UNDO_BUFFER_SIZE_SYM opt_equal size_number { LEX *lex= Lex; lex->alter_tablespace_info->undo_buffer_size= $3; - }; + } + ; opt_ts_redo_buffer_size: REDO_BUFFER_SIZE_SYM opt_equal size_number { LEX *lex= Lex; lex->alter_tablespace_info->redo_buffer_size= $3; - }; + } + ; opt_ts_nodegroup: NODEGROUP_SYM opt_equal real_ulong_num @@ -3501,7 +3550,8 @@ opt_ts_nodegroup: MYSQL_YYABORT; } lex->alter_tablespace_info->nodegroup_id= $3; - }; + } + ; opt_ts_comment: COMMENT_SYM opt_equal TEXT_STRING_sys @@ -3513,7 +3563,8 @@ opt_ts_comment: MYSQL_YYABORT; } lex->alter_tablespace_info->ts_comment= $3.str; - }; + } + ; opt_ts_engine: opt_storage ENGINE_SYM opt_equal storage_engines @@ -3526,12 +3577,13 @@ opt_ts_engine: MYSQL_YYABORT; } lex->alter_tablespace_info->storage_engine= $4; - }; + } + ; opt_ts_wait: /* empty */ - | ts_wait - ; + | ts_wait + ; ts_wait: WAIT_SYM @@ -3539,7 +3591,7 @@ ts_wait: LEX *lex= Lex; lex->alter_tablespace_info->wait_until_completed= TRUE; } - | NO_WAIT_SYM + | NO_WAIT_SYM { LEX *lex= Lex; if (!(lex->alter_tablespace_info->wait_until_completed)) @@ -3548,11 +3600,12 @@ ts_wait: MYSQL_YYABORT; } lex->alter_tablespace_info->wait_until_completed= FALSE; - }; + } + ; size_number: real_ulong_num { $$= $1;} - | IDENT + | IDENT { ulonglong number; uint text_shift_number= 0; @@ -3596,16 +3649,16 @@ size_number: } $$= number; } - ; + ; /* End tablespace part */ create2: - '(' create2a {} + '(' create2a {} | opt_create_table_options - opt_partitioning {} + opt_partitioning {} create3 {} | LIKE table_ident { @@ -3628,7 +3681,7 @@ create2: ; create2a: - field_list ')' opt_create_table_options + field_list ')' opt_create_table_options opt_partitioning {} create3 {} | opt_partitioning {} @@ -3637,10 +3690,10 @@ create2a: ; create3: - /* empty */ {} - | opt_duplicate opt_as create_select + /* empty */ {} + | opt_duplicate opt_as create_select { Select->set_braces(0);} union_clause {} - | opt_duplicate opt_as '(' create_select ')' + | opt_duplicate opt_as '(' create_select ')' { Select->set_braces(1);} union_opt {} ; @@ -3669,552 +3722,552 @@ create3: from the openfrm function. */ opt_partitioning: - /* empty */ {} + /* empty */ {} | partitioning ; partitioning: - PARTITION_SYM - { -#ifdef WITH_PARTITION_STORAGE_ENGINE - LEX *lex= Lex; - LEX_STRING partition_name={C_STRING_WITH_LEN("partition")}; - if (!plugin_is_ready(&partition_name, MYSQL_STORAGE_ENGINE_PLUGIN)) + PARTITION_SYM { +#ifdef WITH_PARTITION_STORAGE_ENGINE + LEX *lex= Lex; + LEX_STRING partition_name={C_STRING_WITH_LEN("partition")}; + if (!plugin_is_ready(&partition_name, MYSQL_STORAGE_ENGINE_PLUGIN)) + { + my_error(ER_FEATURE_DISABLED, MYF(0), + "partitioning", "--with-partition"); + MYSQL_YYABORT; + } + lex->part_info= new partition_info(); + if (!lex->part_info) + { + mem_alloc_error(sizeof(partition_info)); + MYSQL_YYABORT; + } + if (lex->sql_command == SQLCOM_ALTER_TABLE) + { + lex->alter_info.flags|= ALTER_PARTITION; + } +#else my_error(ER_FEATURE_DISABLED, MYF(0), "partitioning", "--with-partition"); MYSQL_YYABORT; - } - lex->part_info= new partition_info(); - if (!lex->part_info) - { - mem_alloc_error(sizeof(partition_info)); - MYSQL_YYABORT; - } - if (lex->sql_command == SQLCOM_ALTER_TABLE) - { - lex->alter_info.flags|= ALTER_PARTITION; - } -#else - my_error(ER_FEATURE_DISABLED, MYF(0), - "partitioning", "--with-partition"); - MYSQL_YYABORT; #endif - } - partition + } + partition ; partition_entry: - PARTITION_SYM - { - LEX *lex= Lex; - if (!lex->part_info) + PARTITION_SYM { - my_parse_error(ER(ER_PARTITION_ENTRY_ERROR)); - MYSQL_YYABORT; + LEX *lex= Lex; + if (!lex->part_info) + { + my_parse_error(ER(ER_PARTITION_ENTRY_ERROR)); + MYSQL_YYABORT; + } + /* + We enter here when opening the frm file to translate + partition info string into part_info data structure. + */ } - /* - We enter here when opening the frm file to translate - partition info string into part_info data structure. - */ - } - partition {} + partition {} ; partition: - BY part_type_def opt_no_parts {} opt_sub_part {} part_defs + BY part_type_def opt_no_parts {} opt_sub_part {} part_defs ; part_type_def: - opt_linear KEY_SYM '(' part_field_list ')' - { - LEX *lex= Lex; - lex->part_info->list_of_part_fields= TRUE; - lex->part_info->part_type= HASH_PARTITION; - } + opt_linear KEY_SYM '(' part_field_list ')' + { + LEX *lex= Lex; + lex->part_info->list_of_part_fields= TRUE; + lex->part_info->part_type= HASH_PARTITION; + } | opt_linear HASH_SYM - { Lex->part_info->part_type= HASH_PARTITION; } - part_func {} + { Lex->part_info->part_type= HASH_PARTITION; } + part_func {} | RANGE_SYM - { Lex->part_info->part_type= RANGE_PARTITION; } - part_func {} + { Lex->part_info->part_type= RANGE_PARTITION; } + part_func {} | LIST_SYM - { Lex->part_info->part_type= LIST_PARTITION; } - part_func {} + { Lex->part_info->part_type= LIST_PARTITION; } + part_func {} ; opt_linear: - /* empty */ {} + /* empty */ {} | LINEAR_SYM - { Lex->part_info->linear_hash_ind= TRUE;} + { Lex->part_info->linear_hash_ind= TRUE;} ; part_field_list: - /* empty */ {} + /* empty */ {} | part_field_item_list {} ; part_field_item_list: - part_field_item {} + part_field_item {} | part_field_item_list ',' part_field_item {} ; part_field_item: - ident - { - if (Lex->part_info->part_field_list.push_back($1.str)) + ident { - mem_alloc_error(1); - MYSQL_YYABORT; + if (Lex->part_info->part_field_list.push_back($1.str)) + { + mem_alloc_error(1); + MYSQL_YYABORT; + } } - } ; part_func: - '(' remember_name part_func_expr remember_end ')' - { - LEX *lex= Lex; - uint expr_len= (uint)($4 - $2) - 1; - lex->part_info->list_of_part_fields= FALSE; - lex->part_info->part_expr= $3; - lex->part_info->part_func_string= (char* ) sql_memdup($2+1, expr_len); - lex->part_info->part_func_len= expr_len; - } + '(' remember_name part_func_expr remember_end ')' + { + LEX *lex= Lex; + uint expr_len= (uint)($4 - $2) - 1; + lex->part_info->list_of_part_fields= FALSE; + lex->part_info->part_expr= $3; + lex->part_info->part_func_string= (char* ) sql_memdup($2+1, expr_len); + lex->part_info->part_func_len= expr_len; + } ; sub_part_func: - '(' remember_name part_func_expr remember_end ')' - { - LEX *lex= Lex; - uint expr_len= (uint)($4 - $2) - 1; - lex->part_info->list_of_subpart_fields= FALSE; - lex->part_info->subpart_expr= $3; - lex->part_info->subpart_func_string= (char* ) sql_memdup($2+1, expr_len); - lex->part_info->subpart_func_len= expr_len; - } + '(' remember_name part_func_expr remember_end ')' + { + LEX *lex= Lex; + uint expr_len= (uint)($4 - $2) - 1; + lex->part_info->list_of_subpart_fields= FALSE; + lex->part_info->subpart_expr= $3; + lex->part_info->subpart_func_string= (char* ) sql_memdup($2+1, expr_len); + lex->part_info->subpart_func_len= expr_len; + } ; opt_no_parts: - /* empty */ {} - | PARTITIONS_SYM real_ulong_num - { - uint no_parts= $2; - LEX *lex= Lex; - if (no_parts == 0) - { - my_error(ER_NO_PARTS_ERROR, MYF(0), "partitions"); - MYSQL_YYABORT; - } + /* empty */ {} + | PARTITIONS_SYM real_ulong_num + { + uint no_parts= $2; + LEX *lex= Lex; + if (no_parts == 0) + { + my_error(ER_NO_PARTS_ERROR, MYF(0), "partitions"); + MYSQL_YYABORT; + } - lex->part_info->no_parts= no_parts; - lex->part_info->use_default_no_partitions= FALSE; - } + lex->part_info->no_parts= no_parts; + lex->part_info->use_default_no_partitions= FALSE; + } ; opt_sub_part: - /* empty */ {} + /* empty */ {} | SUBPARTITION_SYM BY opt_linear HASH_SYM sub_part_func - { Lex->part_info->subpart_type= HASH_PARTITION; } - opt_no_subparts {} + { Lex->part_info->subpart_type= HASH_PARTITION; } + opt_no_subparts {} | SUBPARTITION_SYM BY opt_linear KEY_SYM '(' sub_part_field_list ')' - { - LEX *lex= Lex; - lex->part_info->subpart_type= HASH_PARTITION; - lex->part_info->list_of_subpart_fields= TRUE; - } - opt_no_subparts {} + { + LEX *lex= Lex; + lex->part_info->subpart_type= HASH_PARTITION; + lex->part_info->list_of_subpart_fields= TRUE; + } + opt_no_subparts {} ; sub_part_field_list: - sub_part_field_item {} + sub_part_field_item {} | sub_part_field_list ',' sub_part_field_item {} ; sub_part_field_item: - ident - { - if (Lex->part_info->subpart_field_list.push_back($1.str)) + ident { - mem_alloc_error(1); - MYSQL_YYABORT; - } - } - ; - -part_func_expr: - bit_expr - { - LEX *lex= Lex; - bool not_corr_func; - not_corr_func= !lex->safe_to_cache_query; - lex->safe_to_cache_query= 1; - if (not_corr_func) - { - my_parse_error(ER(ER_CONST_EXPR_IN_PARTITION_FUNC_ERROR)); - MYSQL_YYABORT; - } - $$=$1; - } - ; - -opt_no_subparts: - /* empty */ {} - | SUBPARTITIONS_SYM real_ulong_num - { - uint no_parts= $2; - LEX *lex= Lex; - if (no_parts == 0) - { - my_error(ER_NO_PARTS_ERROR, MYF(0), "subpartitions"); - MYSQL_YYABORT; - } - lex->part_info->no_subparts= no_parts; - lex->part_info->use_default_no_subpartitions= FALSE; - } - ; - -part_defs: - /* empty */ - {} - | '(' part_def_list ')' - { - LEX *lex= Lex; - partition_info *part_info= lex->part_info; - uint count_curr_parts= part_info->partitions.elements; - if (part_info->no_parts != 0) - { - if (part_info->no_parts != - count_curr_parts) + if (Lex->part_info->subpart_field_list.push_back($1.str)) { - my_parse_error(ER(ER_PARTITION_WRONG_NO_PART_ERROR)); + mem_alloc_error(1); MYSQL_YYABORT; } } - else if (count_curr_parts > 0) + ; + +part_func_expr: + bit_expr { - part_info->no_parts= count_curr_parts; + LEX *lex= Lex; + bool not_corr_func; + not_corr_func= !lex->safe_to_cache_query; + lex->safe_to_cache_query= 1; + if (not_corr_func) + { + my_parse_error(ER(ER_CONST_EXPR_IN_PARTITION_FUNC_ERROR)); + MYSQL_YYABORT; + } + $$=$1; + } + ; + +opt_no_subparts: + /* empty */ {} + | SUBPARTITIONS_SYM real_ulong_num + { + uint no_parts= $2; + LEX *lex= Lex; + if (no_parts == 0) + { + my_error(ER_NO_PARTS_ERROR, MYF(0), "subpartitions"); + MYSQL_YYABORT; + } + lex->part_info->no_subparts= no_parts; + lex->part_info->use_default_no_subpartitions= FALSE; + } + ; + +part_defs: + /* empty */ + {} + | '(' part_def_list ')' + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + uint count_curr_parts= part_info->partitions.elements; + if (part_info->no_parts != 0) + { + if (part_info->no_parts != + count_curr_parts) + { + my_parse_error(ER(ER_PARTITION_WRONG_NO_PART_ERROR)); + MYSQL_YYABORT; + } + } + else if (count_curr_parts > 0) + { + part_info->no_parts= count_curr_parts; + } + part_info->count_curr_subparts= 0; } - part_info->count_curr_subparts= 0; - } ; part_def_list: - part_definition {} + part_definition {} | part_def_list ',' part_definition {} ; part_definition: - PARTITION_SYM - { - LEX *lex= Lex; - partition_info *part_info= lex->part_info; - partition_element *p_elem= new partition_element(); - - if (!p_elem || part_info->partitions.push_back(p_elem)) + PARTITION_SYM { - mem_alloc_error(sizeof(partition_element)); - MYSQL_YYABORT; + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + partition_element *p_elem= new partition_element(); + + if (!p_elem || part_info->partitions.push_back(p_elem)) + { + mem_alloc_error(sizeof(partition_element)); + MYSQL_YYABORT; + } + p_elem->part_state= PART_NORMAL; + part_info->curr_part_elem= p_elem; + part_info->current_partition= p_elem; + part_info->use_default_partitions= FALSE; + part_info->use_default_no_partitions= FALSE; } - p_elem->part_state= PART_NORMAL; - part_info->curr_part_elem= p_elem; - part_info->current_partition= p_elem; - part_info->use_default_partitions= FALSE; - part_info->use_default_no_partitions= FALSE; - } - part_name {} - opt_part_values {} - opt_part_options {} - opt_sub_partition {} + part_name {} + opt_part_values {} + opt_part_options {} + opt_sub_partition {} ; part_name: - ident - { - LEX *lex= Lex; - partition_info *part_info= lex->part_info; - partition_element *p_elem= part_info->curr_part_elem; - p_elem->partition_name= $1.str; - } + ident + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + partition_element *p_elem= part_info->curr_part_elem; + p_elem->partition_name= $1.str; + } ; opt_part_values: - /* empty */ - { - LEX *lex= Lex; - if (! lex->is_partition_management()) + /* empty */ { - if (lex->part_info->part_type == RANGE_PARTITION) + LEX *lex= Lex; + if (! lex->is_partition_management()) { - my_error(ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), - "RANGE", "LESS THAN"); - MYSQL_YYABORT; - } - if (lex->part_info->part_type == LIST_PARTITION) - { - my_error(ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), - "LIST", "IN"); - MYSQL_YYABORT; + if (lex->part_info->part_type == RANGE_PARTITION) + { + my_error(ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), + "RANGE", "LESS THAN"); + MYSQL_YYABORT; + } + if (lex->part_info->part_type == LIST_PARTITION) + { + my_error(ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), + "LIST", "IN"); + MYSQL_YYABORT; + } } + else + lex->part_info->part_type= HASH_PARTITION; } - else - lex->part_info->part_type= HASH_PARTITION; - } | VALUES LESS_SYM THAN_SYM part_func_max - { - LEX *lex= Lex; - if (! lex->is_partition_management()) { - if (Lex->part_info->part_type != RANGE_PARTITION) + LEX *lex= Lex; + if (! lex->is_partition_management()) { - my_error(ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), - "RANGE", "LESS THAN"); - MYSQL_YYABORT; + if (Lex->part_info->part_type != RANGE_PARTITION) + { + my_error(ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "RANGE", "LESS THAN"); + MYSQL_YYABORT; + } } + else + lex->part_info->part_type= RANGE_PARTITION; } - else - lex->part_info->part_type= RANGE_PARTITION; - } | VALUES IN_SYM '(' part_list_func ')' - { - LEX *lex= Lex; - if (! lex->is_partition_management()) { - if (Lex->part_info->part_type != LIST_PARTITION) + LEX *lex= Lex; + if (! lex->is_partition_management()) { - my_error(ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), - "LIST", "IN"); - MYSQL_YYABORT; + if (Lex->part_info->part_type != LIST_PARTITION) + { + my_error(ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "LIST", "IN"); + MYSQL_YYABORT; + } } + else + lex->part_info->part_type= LIST_PARTITION; } - else - lex->part_info->part_type= LIST_PARTITION; - } ; part_func_max: - max_value_sym - { - LEX *lex= Lex; - if (lex->part_info->defined_max_value) + max_value_sym { - my_parse_error(ER(ER_PARTITION_MAXVALUE_ERROR)); - MYSQL_YYABORT; + LEX *lex= Lex; + if (lex->part_info->defined_max_value) + { + my_parse_error(ER(ER_PARTITION_MAXVALUE_ERROR)); + MYSQL_YYABORT; + } + lex->part_info->defined_max_value= TRUE; + lex->part_info->curr_part_elem->max_value= TRUE; + lex->part_info->curr_part_elem->range_value= LONGLONG_MAX; } - lex->part_info->defined_max_value= TRUE; - lex->part_info->curr_part_elem->max_value= TRUE; - lex->part_info->curr_part_elem->range_value= LONGLONG_MAX; - } | part_range_func - { - if (Lex->part_info->defined_max_value) { - my_parse_error(ER(ER_PARTITION_MAXVALUE_ERROR)); - MYSQL_YYABORT; + if (Lex->part_info->defined_max_value) + { + my_parse_error(ER(ER_PARTITION_MAXVALUE_ERROR)); + MYSQL_YYABORT; + } + if (Lex->part_info->curr_part_elem->has_null_value) + { + my_parse_error(ER(ER_NULL_IN_VALUES_LESS_THAN)); + MYSQL_YYABORT; + } } - if (Lex->part_info->curr_part_elem->has_null_value) - { - my_parse_error(ER(ER_NULL_IN_VALUES_LESS_THAN)); - MYSQL_YYABORT; - } - } ; max_value_sym: - MAX_VALUE_SYM + MAX_VALUE_SYM | '(' MAX_VALUE_SYM ')' ; part_range_func: - '(' part_bit_expr ')' - { - partition_info *part_info= Lex->part_info; - if (!($2->unsigned_flag)) - part_info->curr_part_elem->signed_flag= TRUE; - part_info->curr_part_elem->range_value= $2->value; - } + '(' part_bit_expr ')' + { + partition_info *part_info= Lex->part_info; + if (!($2->unsigned_flag)) + part_info->curr_part_elem->signed_flag= TRUE; + part_info->curr_part_elem->range_value= $2->value; + } ; part_list_func: - part_list_item {} + part_list_item {} | part_list_func ',' part_list_item {} ; part_list_item: - part_bit_expr - { - part_elem_value *value_ptr= $1; - partition_info *part_info= Lex->part_info; - if (!value_ptr->unsigned_flag) - part_info->curr_part_elem->signed_flag= TRUE; - if (!value_ptr->null_value && - part_info->curr_part_elem-> - list_val_list.push_back(value_ptr)) + part_bit_expr { - mem_alloc_error(sizeof(part_elem_value)); - MYSQL_YYABORT; + part_elem_value *value_ptr= $1; + partition_info *part_info= Lex->part_info; + if (!value_ptr->unsigned_flag) + part_info->curr_part_elem->signed_flag= TRUE; + if (!value_ptr->null_value && + part_info->curr_part_elem-> + list_val_list.push_back(value_ptr)) + { + mem_alloc_error(sizeof(part_elem_value)); + MYSQL_YYABORT; + } } - } ; part_bit_expr: - bit_expr - { - Item *part_expr= $1; - THD *thd= YYTHD; - LEX *lex= thd->lex; - Name_resolution_context *context= &lex->current_select->context; - TABLE_LIST *save_list= context->table_list; - const char *save_where= thd->where; + bit_expr + { + Item *part_expr= $1; + THD *thd= YYTHD; + LEX *lex= thd->lex; + Name_resolution_context *context= &lex->current_select->context; + TABLE_LIST *save_list= context->table_list; + const char *save_where= thd->where; - context->table_list= 0; - thd->where= "partition function"; + context->table_list= 0; + thd->where= "partition function"; - part_elem_value *value_ptr= - (part_elem_value*)sql_alloc(sizeof(part_elem_value)); - if (!value_ptr) - { - mem_alloc_error(sizeof(part_elem_value)); - MYSQL_YYABORT; - } - if (part_expr->walk(&Item::check_partition_func_processor, 0, - NULL)) - { - my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0)); - MYSQL_YYABORT; - } - if (part_expr->fix_fields(YYTHD, (Item**)0) || - ((context->table_list= save_list), FALSE) || - (!part_expr->const_item()) || - (!lex->safe_to_cache_query)) - { - my_error(ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR, MYF(0)); - MYSQL_YYABORT; - } - thd->where= save_where; - value_ptr->value= part_expr->val_int(); - value_ptr->unsigned_flag= TRUE; - if (!part_expr->unsigned_flag && - value_ptr->value < 0) - value_ptr->unsigned_flag= FALSE; - if ((value_ptr->null_value= part_expr->null_value)) - { - if (Lex->part_info->curr_part_elem->has_null_value) + part_elem_value *value_ptr= + (part_elem_value*)sql_alloc(sizeof(part_elem_value)); + if (!value_ptr) { - my_error(ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR, MYF(0)); + mem_alloc_error(sizeof(part_elem_value)); MYSQL_YYABORT; } - Lex->part_info->curr_part_elem->has_null_value= TRUE; + if (part_expr->walk(&Item::check_partition_func_processor, 0, + NULL)) + { + my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0)); + MYSQL_YYABORT; + } + if (part_expr->fix_fields(YYTHD, (Item**)0) || + ((context->table_list= save_list), FALSE) || + (!part_expr->const_item()) || + (!lex->safe_to_cache_query)) + { + my_error(ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR, MYF(0)); + MYSQL_YYABORT; + } + thd->where= save_where; + value_ptr->value= part_expr->val_int(); + value_ptr->unsigned_flag= TRUE; + if (!part_expr->unsigned_flag && + value_ptr->value < 0) + value_ptr->unsigned_flag= FALSE; + if ((value_ptr->null_value= part_expr->null_value)) + { + if (Lex->part_info->curr_part_elem->has_null_value) + { + my_error(ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR, MYF(0)); + MYSQL_YYABORT; + } + Lex->part_info->curr_part_elem->has_null_value= TRUE; + } + else if (part_expr->result_type() != INT_RESULT) + { + my_parse_error(ER(ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR)); + MYSQL_YYABORT; + } + $$= value_ptr; } - else if (part_expr->result_type() != INT_RESULT) - { - my_parse_error(ER(ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR)); - MYSQL_YYABORT; - } - $$= value_ptr; - } ; opt_sub_partition: - /* empty */ - { - if (Lex->part_info->no_subparts != 0 && - !Lex->part_info->use_default_subpartitions) + /* empty */ { - my_parse_error(ER(ER_PARTITION_WRONG_NO_SUBPART_ERROR)); - MYSQL_YYABORT; + if (Lex->part_info->no_subparts != 0 && + !Lex->part_info->use_default_subpartitions) + { + my_parse_error(ER(ER_PARTITION_WRONG_NO_SUBPART_ERROR)); + MYSQL_YYABORT; + } } - } | '(' sub_part_list ')' - { - LEX *lex= Lex; - partition_info *part_info= lex->part_info; - if (part_info->no_subparts != 0) { - if (part_info->no_subparts != - part_info->count_curr_subparts) + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (part_info->no_subparts != 0) { - my_parse_error(ER(ER_PARTITION_WRONG_NO_SUBPART_ERROR)); - MYSQL_YYABORT; + if (part_info->no_subparts != + part_info->count_curr_subparts) + { + my_parse_error(ER(ER_PARTITION_WRONG_NO_SUBPART_ERROR)); + MYSQL_YYABORT; + } } - } - else if (part_info->count_curr_subparts > 0) - { - if (part_info->partitions.elements > 1) + else if (part_info->count_curr_subparts > 0) { - my_parse_error(ER(ER_PARTITION_WRONG_NO_SUBPART_ERROR)); - MYSQL_YYABORT; + if (part_info->partitions.elements > 1) + { + my_parse_error(ER(ER_PARTITION_WRONG_NO_SUBPART_ERROR)); + MYSQL_YYABORT; + } + part_info->no_subparts= part_info->count_curr_subparts; } - part_info->no_subparts= part_info->count_curr_subparts; + part_info->count_curr_subparts= 0; } - part_info->count_curr_subparts= 0; - } ; sub_part_list: - sub_part_definition {} + sub_part_definition {} | sub_part_list ',' sub_part_definition {} ; sub_part_definition: - SUBPARTITION_SYM - { - LEX *lex= Lex; - partition_info *part_info= lex->part_info; - partition_element *curr_part= part_info->current_partition; - partition_element *sub_p_elem= new partition_element(curr_part); - if (!sub_p_elem || - curr_part->subpartitions.push_back(sub_p_elem)) + SUBPARTITION_SYM { - mem_alloc_error(sizeof(partition_element)); - MYSQL_YYABORT; + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + partition_element *curr_part= part_info->current_partition; + partition_element *sub_p_elem= new partition_element(curr_part); + if (!sub_p_elem || + curr_part->subpartitions.push_back(sub_p_elem)) + { + mem_alloc_error(sizeof(partition_element)); + MYSQL_YYABORT; + } + part_info->curr_part_elem= sub_p_elem; + part_info->use_default_subpartitions= FALSE; + part_info->use_default_no_subpartitions= FALSE; + part_info->count_curr_subparts++; } - part_info->curr_part_elem= sub_p_elem; - part_info->use_default_subpartitions= FALSE; - part_info->use_default_no_subpartitions= FALSE; - part_info->count_curr_subparts++; - } - sub_name opt_part_options {} + sub_name opt_part_options {} ; sub_name: - ident_or_text - { Lex->part_info->curr_part_elem->partition_name= $1.str; } + ident_or_text + { Lex->part_info->curr_part_elem->partition_name= $1.str; } ; opt_part_options: - /* empty */ {} + /* empty */ {} | opt_part_option_list {} ; opt_part_option_list: - opt_part_option_list opt_part_option {} + opt_part_option_list opt_part_option {} | opt_part_option {} ; opt_part_option: - TABLESPACE opt_equal ident_or_text - { Lex->part_info->curr_part_elem->tablespace_name= $3.str; } + TABLESPACE opt_equal ident_or_text + { Lex->part_info->curr_part_elem->tablespace_name= $3.str; } | opt_storage ENGINE_SYM opt_equal storage_engines - { - LEX *lex= Lex; - lex->part_info->curr_part_elem->engine_type= $4; - lex->part_info->default_engine_type= $4; - } + { + LEX *lex= Lex; + lex->part_info->curr_part_elem->engine_type= $4; + lex->part_info->default_engine_type= $4; + } | NODEGROUP_SYM opt_equal real_ulong_num - { Lex->part_info->curr_part_elem->nodegroup_id= (uint16) $3; } + { Lex->part_info->curr_part_elem->nodegroup_id= (uint16) $3; } | MAX_ROWS opt_equal real_ulonglong_num - { Lex->part_info->curr_part_elem->part_max_rows= (ha_rows) $3; } + { Lex->part_info->curr_part_elem->part_max_rows= (ha_rows) $3; } | MIN_ROWS opt_equal real_ulonglong_num - { Lex->part_info->curr_part_elem->part_min_rows= (ha_rows) $3; } + { Lex->part_info->curr_part_elem->part_min_rows= (ha_rows) $3; } | DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys - { Lex->part_info->curr_part_elem->data_file_name= $4.str; } + { Lex->part_info->curr_part_elem->data_file_name= $4.str; } | INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys - { Lex->part_info->curr_part_elem->index_file_name= $4.str; } + { Lex->part_info->curr_part_elem->index_file_name= $4.str; } | COMMENT_SYM opt_equal TEXT_STRING_sys - { Lex->part_info->curr_part_elem->part_comment= $3.str; } + { Lex->part_info->curr_part_elem->part_comment= $3.str; } ; /* @@ -4224,93 +4277,132 @@ opt_part_option: create_select: SELECT_SYM { - LEX *lex=Lex; - lex->lock_option= using_update_log ? TL_READ_NO_INSERT : TL_READ; - if (lex->sql_command == SQLCOM_INSERT) - lex->sql_command= SQLCOM_INSERT_SELECT; - else if (lex->sql_command == SQLCOM_REPLACE) - lex->sql_command= SQLCOM_REPLACE_SELECT; - /* + LEX *lex=Lex; + lex->lock_option= using_update_log ? TL_READ_NO_INSERT : TL_READ; + if (lex->sql_command == SQLCOM_INSERT) + lex->sql_command= SQLCOM_INSERT_SELECT; + else if (lex->sql_command == SQLCOM_REPLACE) + lex->sql_command= SQLCOM_REPLACE_SELECT; + /* The following work only with the local list, the global list is created correctly in this case - */ - lex->current_select->table_list.save_and_clear(&lex->save_list); - mysql_init_select(lex); - lex->current_select->parsing_place= SELECT_LIST; + */ + lex->current_select->table_list.save_and_clear(&lex->save_list); + mysql_init_select(lex); + lex->current_select->parsing_place= SELECT_LIST; } select_options select_item_list - { - Select->parsing_place= NO_MATTER; - } - opt_select_from - { - /* + { + Select->parsing_place= NO_MATTER; + } + opt_select_from + { + /* The following work only with the local list, the global list is created correctly in this case - */ - Lex->current_select->table_list.push_front(&Lex->save_list); - } + */ + Lex->current_select->table_list.push_front(&Lex->save_list); + } ; opt_as: - /* empty */ {} - | AS {}; + /* empty */ {} + | AS {} + ; opt_create_database_options: - /* empty */ {} - | create_database_options {}; + /* empty */ {} + | create_database_options {} + ; create_database_options: - create_database_option {} - | create_database_options create_database_option {}; + create_database_option {} + | create_database_options create_database_option {} + ; create_database_option: - default_collation {} - | default_charset {}; + default_collation {} + | default_charset {} + ; opt_table_options: - /* empty */ { $$= 0; } - | table_options { $$= $1;}; + /* empty */ { $$= 0; } + | table_options { $$= $1;} + ; table_options: - table_option { $$=$1; } - | table_option table_options { $$= $1 | $2; }; + table_option { $$=$1; } + | table_option table_options { $$= $1 | $2; } + ; table_option: - TEMPORARY { $$=HA_LEX_CREATE_TMP_TABLE; }; + TEMPORARY { $$=HA_LEX_CREATE_TMP_TABLE; } + ; opt_if_not_exists: - /* empty */ { $$= 0; } - | IF not EXISTS { $$=HA_LEX_CREATE_IF_NOT_EXISTS; }; + /* empty */ { $$= 0; } + | IF not EXISTS { $$=HA_LEX_CREATE_IF_NOT_EXISTS; } + ; opt_create_table_options: - /* empty */ - | create_table_options; + /* empty */ + | create_table_options + ; create_table_options_space_separated: - create_table_option - | create_table_option create_table_options_space_separated; + create_table_option + | create_table_option create_table_options_space_separated + ; create_table_options: - create_table_option - | create_table_option create_table_options - | create_table_option ',' create_table_options; + create_table_option + | create_table_option create_table_options + | create_table_option ',' create_table_options + ; create_table_option: - ENGINE_SYM opt_equal storage_engines { Lex->create_info.db_type= $3; Lex->create_info.used_fields|= HA_CREATE_USED_ENGINE; } - | TYPE_SYM opt_equal storage_engines + ENGINE_SYM opt_equal storage_engines + { + Lex->create_info.db_type= $3; + Lex->create_info.used_fields|= HA_CREATE_USED_ENGINE; + } + | TYPE_SYM opt_equal storage_engines { Lex->create_info.db_type= $3; WARN_DEPRECATED(yythd, "5.2", "TYPE=storage_engine", "'ENGINE=storage_engine'"); Lex->create_info.used_fields|= HA_CREATE_USED_ENGINE; } - | MAX_ROWS opt_equal ulonglong_num { Lex->create_info.max_rows= $3; Lex->create_info.used_fields|= HA_CREATE_USED_MAX_ROWS;} - | MIN_ROWS opt_equal ulonglong_num { Lex->create_info.min_rows= $3; Lex->create_info.used_fields|= HA_CREATE_USED_MIN_ROWS;} - | AVG_ROW_LENGTH opt_equal ulong_num { Lex->create_info.avg_row_length=$3; Lex->create_info.used_fields|= HA_CREATE_USED_AVG_ROW_LENGTH;} - | PASSWORD opt_equal TEXT_STRING_sys { Lex->create_info.password=$3.str; Lex->create_info.used_fields|= HA_CREATE_USED_PASSWORD; } - | COMMENT_SYM opt_equal TEXT_STRING_sys { Lex->create_info.comment=$3; Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; } - | AUTO_INC opt_equal ulonglong_num { Lex->create_info.auto_increment_value=$3; Lex->create_info.used_fields|= HA_CREATE_USED_AUTO;} + | MAX_ROWS opt_equal ulonglong_num + { + Lex->create_info.max_rows= $3; + Lex->create_info.used_fields|= HA_CREATE_USED_MAX_ROWS; + } + | MIN_ROWS opt_equal ulonglong_num + { + Lex->create_info.min_rows= $3; + Lex->create_info.used_fields|= HA_CREATE_USED_MIN_ROWS; + } + | AVG_ROW_LENGTH opt_equal ulong_num + { + Lex->create_info.avg_row_length=$3; + Lex->create_info.used_fields|= HA_CREATE_USED_AVG_ROW_LENGTH; + } + | PASSWORD opt_equal TEXT_STRING_sys + { + Lex->create_info.password=$3.str; + Lex->create_info.used_fields|= HA_CREATE_USED_PASSWORD; + } + | COMMENT_SYM opt_equal TEXT_STRING_sys + { + Lex->create_info.comment=$3; + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } + | AUTO_INC opt_equal ulonglong_num + { + Lex->create_info.auto_increment_value=$3; + Lex->create_info.used_fields|= HA_CREATE_USED_AUTO; + } | PACK_KEYS_SYM opt_equal ulong_num { switch($3) { @@ -4332,182 +4424,220 @@ create_table_option: ~(HA_OPTION_PACK_KEYS | HA_OPTION_NO_PACK_KEYS); Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; } - | CHECKSUM_SYM opt_equal ulong_num { Lex->create_info.table_options|= $3 ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; } - | DELAY_KEY_WRITE_SYM opt_equal ulong_num { Lex->create_info.table_options|= $3 ? HA_OPTION_DELAY_KEY_WRITE : HA_OPTION_NO_DELAY_KEY_WRITE; Lex->create_info.used_fields|= HA_CREATE_USED_DELAY_KEY_WRITE; } - | ROW_FORMAT_SYM opt_equal row_types { Lex->create_info.row_type= $3; Lex->create_info.used_fields|= HA_CREATE_USED_ROW_FORMAT; } - | UNION_SYM opt_equal '(' table_list ')' - { - /* Move the union list to the merge_list */ - LEX *lex=Lex; - TABLE_LIST *table_list= lex->select_lex.get_table_list(); - lex->create_info.merge_list= lex->select_lex.table_list; - lex->create_info.merge_list.elements--; - lex->create_info.merge_list.first= - (uchar*) (table_list->next_local); - lex->select_lex.table_list.elements=1; - lex->select_lex.table_list.next= - (uchar**) &(table_list->next_local); - table_list->next_local= 0; - lex->create_info.used_fields|= HA_CREATE_USED_UNION; - } - | default_charset - | default_collation - | INSERT_METHOD opt_equal merge_insert_types { Lex->create_info.merge_insert_method= $3; Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD;} - | DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys { Lex->create_info.data_file_name= $4.str; Lex->create_info.used_fields|= HA_CREATE_USED_DATADIR; } - | INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys { Lex->create_info.index_file_name= $4.str; Lex->create_info.used_fields|= HA_CREATE_USED_INDEXDIR; } - | TABLESPACE ident {Lex->create_info.tablespace= $2.str;} - | STORAGE_SYM DISK_SYM {Lex->create_info.storage_media= HA_SM_DISK;} - | STORAGE_SYM MEMORY_SYM {Lex->create_info.storage_media= HA_SM_MEMORY;} - | CONNECTION_SYM opt_equal TEXT_STRING_sys { Lex->create_info.connect_string.str= $3.str; Lex->create_info.connect_string.length= $3.length; Lex->create_info.used_fields|= HA_CREATE_USED_CONNECTION; } - | KEY_BLOCK_SIZE opt_equal ulong_num - { - Lex->create_info.used_fields|= HA_CREATE_USED_KEY_BLOCK_SIZE; - Lex->create_info.key_block_size= $3; - } + | CHECKSUM_SYM opt_equal ulong_num + { + Lex->create_info.table_options|= $3 ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; + Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; + } + | DELAY_KEY_WRITE_SYM opt_equal ulong_num + { + Lex->create_info.table_options|= $3 ? HA_OPTION_DELAY_KEY_WRITE : HA_OPTION_NO_DELAY_KEY_WRITE; + Lex->create_info.used_fields|= HA_CREATE_USED_DELAY_KEY_WRITE; + } + | ROW_FORMAT_SYM opt_equal row_types + { + Lex->create_info.row_type= $3; + Lex->create_info.used_fields|= HA_CREATE_USED_ROW_FORMAT; + } + | UNION_SYM opt_equal '(' table_list ')' + { + /* Move the union list to the merge_list */ + LEX *lex=Lex; + TABLE_LIST *table_list= lex->select_lex.get_table_list(); + lex->create_info.merge_list= lex->select_lex.table_list; + lex->create_info.merge_list.elements--; + lex->create_info.merge_list.first= + (uchar*) (table_list->next_local); + lex->select_lex.table_list.elements=1; + lex->select_lex.table_list.next= + (uchar**) &(table_list->next_local); + table_list->next_local= 0; + lex->create_info.used_fields|= HA_CREATE_USED_UNION; + } + | default_charset + | default_collation + | INSERT_METHOD opt_equal merge_insert_types + { + Lex->create_info.merge_insert_method= $3; + Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD; + } + | DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys + { + Lex->create_info.data_file_name= $4.str; + Lex->create_info.used_fields|= HA_CREATE_USED_DATADIR; + } + | INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys + { + Lex->create_info.index_file_name= $4.str; + Lex->create_info.used_fields|= HA_CREATE_USED_INDEXDIR; + } + | TABLESPACE ident + {Lex->create_info.tablespace= $2.str;} + | STORAGE_SYM DISK_SYM + {Lex->create_info.storage_media= HA_SM_DISK;} + | STORAGE_SYM MEMORY_SYM + {Lex->create_info.storage_media= HA_SM_MEMORY;} + | CONNECTION_SYM opt_equal TEXT_STRING_sys + { + Lex->create_info.connect_string.str= $3.str; + Lex->create_info.connect_string.length= $3.length; + Lex->create_info.used_fields|= HA_CREATE_USED_CONNECTION; + } + | KEY_BLOCK_SIZE opt_equal ulong_num + { + Lex->create_info.used_fields|= HA_CREATE_USED_KEY_BLOCK_SIZE; + Lex->create_info.key_block_size= $3; + } ; default_charset: - opt_default charset opt_equal charset_name_or_default - { - HA_CREATE_INFO *cinfo= &Lex->create_info; - if ((cinfo->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) && - cinfo->default_table_charset && $4 && - !my_charset_same(cinfo->default_table_charset,$4)) + opt_default charset opt_equal charset_name_or_default { - my_error(ER_CONFLICTING_DECLARATIONS, MYF(0), - "CHARACTER SET ", cinfo->default_table_charset->csname, - "CHARACTER SET ", $4->csname); - MYSQL_YYABORT; - } - Lex->create_info.default_table_charset= $4; - Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET; - }; - -default_collation: - opt_default COLLATE_SYM opt_equal collation_name_or_default - { - HA_CREATE_INFO *cinfo= &Lex->create_info; - if ((cinfo->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) && - cinfo->default_table_charset && $4 && - !my_charset_same(cinfo->default_table_charset,$4)) + HA_CREATE_INFO *cinfo= &Lex->create_info; + if ((cinfo->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) && + cinfo->default_table_charset && $4 && + !my_charset_same(cinfo->default_table_charset,$4)) { - my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0), - $4->name, cinfo->default_table_charset->csname); + my_error(ER_CONFLICTING_DECLARATIONS, MYF(0), + "CHARACTER SET ", cinfo->default_table_charset->csname, + "CHARACTER SET ", $4->csname); MYSQL_YYABORT; } Lex->create_info.default_table_charset= $4; Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET; - }; + } + ; + +default_collation: + opt_default COLLATE_SYM opt_equal collation_name_or_default + { + HA_CREATE_INFO *cinfo= &Lex->create_info; + if ((cinfo->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) && + cinfo->default_table_charset && $4 && + !my_charset_same(cinfo->default_table_charset,$4)) + { + my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0), + $4->name, cinfo->default_table_charset->csname); + MYSQL_YYABORT; + } + Lex->create_info.default_table_charset= $4; + Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET; + } + ; storage_engines: - ident_or_text - { - plugin_ref plugin= ha_resolve_by_name(YYTHD, &$1); - - if (plugin) - $$= plugin_data(plugin, handlerton*); - else + ident_or_text { - if (YYTHD->variables.sql_mode & MODE_NO_ENGINE_SUBSTITUTION) + plugin_ref plugin= ha_resolve_by_name(YYTHD, &$1); + + if (plugin) + $$= plugin_data(plugin, handlerton*); + else + { + if (YYTHD->variables.sql_mode & MODE_NO_ENGINE_SUBSTITUTION) + { + my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), $1.str); + MYSQL_YYABORT; + } + $$= 0; + push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_UNKNOWN_STORAGE_ENGINE, + ER(ER_UNKNOWN_STORAGE_ENGINE), + $1.str); + } + } + ; + +known_storage_engines: + ident_or_text + { + plugin_ref plugin; + if ((plugin= ha_resolve_by_name(YYTHD, &$1))) + $$= plugin_data(plugin, handlerton*); + else { my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), $1.str); MYSQL_YYABORT; } - $$= 0; - push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_UNKNOWN_STORAGE_ENGINE, - ER(ER_UNKNOWN_STORAGE_ENGINE), - $1.str); } - } - ; - -known_storage_engines: - ident_or_text - { - plugin_ref plugin; - if ((plugin= ha_resolve_by_name(YYTHD, &$1))) - $$= plugin_data(plugin, handlerton*); - else - { - my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), $1.str); - MYSQL_YYABORT; - } - } ; row_types: - DEFAULT { $$= ROW_TYPE_DEFAULT; } - | FIXED_SYM { $$= ROW_TYPE_FIXED; } - | DYNAMIC_SYM { $$= ROW_TYPE_DYNAMIC; } - | COMPRESSED_SYM { $$= ROW_TYPE_COMPRESSED; } - | REDUNDANT_SYM { $$= ROW_TYPE_REDUNDANT; } - | COMPACT_SYM { $$= ROW_TYPE_COMPACT; }; + DEFAULT { $$= ROW_TYPE_DEFAULT; } + | FIXED_SYM { $$= ROW_TYPE_FIXED; } + | DYNAMIC_SYM { $$= ROW_TYPE_DYNAMIC; } + | COMPRESSED_SYM { $$= ROW_TYPE_COMPRESSED; } + | REDUNDANT_SYM { $$= ROW_TYPE_REDUNDANT; } + | COMPACT_SYM { $$= ROW_TYPE_COMPACT; } + ; merge_insert_types: - NO_SYM { $$= MERGE_INSERT_DISABLED; } + NO_SYM { $$= MERGE_INSERT_DISABLED; } | FIRST_SYM { $$= MERGE_INSERT_TO_FIRST; } - | LAST_SYM { $$= MERGE_INSERT_TO_LAST; }; + | LAST_SYM { $$= MERGE_INSERT_TO_LAST; } + ; opt_select_from: - opt_limit_clause {} - | select_from select_lock_type; + opt_limit_clause {} + | select_from select_lock_type + ; udf_func_type: - /* empty */ { $$ = UDFTYPE_FUNCTION; } - | AGGREGATE_SYM { $$ = UDFTYPE_AGGREGATE; }; + /* empty */ { $$ = UDFTYPE_FUNCTION; } + | AGGREGATE_SYM { $$ = UDFTYPE_AGGREGATE; }; udf_type: - STRING_SYM {$$ = (int) STRING_RESULT; } - | REAL {$$ = (int) REAL_RESULT; } + STRING_SYM {$$ = (int) STRING_RESULT; } + | REAL {$$ = (int) REAL_RESULT; } | DECIMAL_SYM {$$ = (int) DECIMAL_RESULT; } - | INT_SYM {$$ = (int) INT_RESULT; }; + | INT_SYM {$$ = (int) INT_RESULT; } + ; field_list: - field_list_item - | field_list ',' field_list_item; - + field_list_item + | field_list ',' field_list_item + ; field_list_item: - column_def - | key_def - ; + column_def + | key_def + ; column_def: - field_spec opt_check_constraint - | field_spec references - { - Lex->col_list.empty(); /* Alloced by sql_alloc */ - } - ; + field_spec opt_check_constraint + | field_spec references + { + Lex->col_list.empty(); /* Alloced by sql_alloc */ + } + ; key_def: - key_type opt_ident key_alg '(' key_list ')' key_options - { - LEX *lex=Lex; - if ($1 != Key::FULLTEXT && lex->key_create_info.parser_name.str) - { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } + key_type opt_ident key_alg '(' key_list ')' key_options + { + LEX *lex=Lex; + if ($1 != Key::FULLTEXT && lex->key_create_info.parser_name.str) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } Key *key= new Key($1, $2, &lex->key_create_info, 0, lex->col_list); - lex->alter_info.key_list.push_back(key); - lex->col_list.empty(); /* Alloced by sql_alloc */ - } - | opt_constraint constraint_key_type opt_ident key_alg - '(' key_list ')' key_options - { - LEX *lex=Lex; - const char *key_name= $3 ? $3 : $1; + lex->alter_info.key_list.push_back(key); + lex->col_list.empty(); /* Alloced by sql_alloc */ + } + | opt_constraint constraint_key_type opt_ident key_alg + '(' key_list ')' key_options + { + LEX *lex=Lex; + const char *key_name= $3 ? $3 : $1; Key *key= new Key($2, key_name, &lex->key_create_info, 0, lex->col_list); - lex->alter_info.key_list.push_back(key); - lex->col_list.empty(); /* Alloced by sql_alloc */ - } - | opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references - { - LEX *lex=Lex; + lex->alter_info.key_list.push_back(key); + lex->col_list.empty(); /* Alloced by sql_alloc */ + } + | opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references + { + LEX *lex=Lex; const char *key_name= $4 ? $4 : $1; Key *key= new Foreign_key(key_name, lex->col_list, $8, @@ -4520,117 +4650,168 @@ key_def: &default_key_create_info, 1, lex->col_list); lex->alter_info.key_list.push_back(key); - lex->col_list.empty(); /* Alloced by sql_alloc */ + lex->col_list.empty(); /* Alloced by sql_alloc */ /* Only used for ALTER TABLE. Ignored otherwise. */ lex->alter_info.flags|= ALTER_FOREIGN_KEY; - } - | constraint opt_check_constraint - { - Lex->col_list.empty(); /* Alloced by sql_alloc */ - } - | opt_constraint check_constraint - { - Lex->col_list.empty(); /* Alloced by sql_alloc */ - } - ; + } + | constraint opt_check_constraint + { + Lex->col_list.empty(); /* Alloced by sql_alloc */ + } + | opt_constraint check_constraint + { + Lex->col_list.empty(); /* Alloced by sql_alloc */ + } + ; opt_check_constraint: - /* empty */ - | check_constraint - ; + /* empty */ + | check_constraint + ; check_constraint: - CHECK_SYM expr - ; + CHECK_SYM expr + ; opt_constraint: - /* empty */ { $$=(char*) 0; } - | constraint { $$= $1; } - ; + /* empty */ { $$=(char*) 0; } + | constraint { $$= $1; } + ; constraint: - CONSTRAINT opt_ident { $$=$2; } - ; + CONSTRAINT opt_ident { $$=$2; } + ; field_spec: - field_ident - { - LEX *lex=Lex; - lex->length=lex->dec=0; lex->type=0; - lex->default_value= lex->on_update_value= 0; - lex->comment=null_lex_str; - lex->charset=NULL; - } - type opt_attribute - { - LEX *lex=Lex; - if (add_field_to_list(lex->thd, &$1, (enum enum_field_types) $3, - lex->length,lex->dec,lex->type, - lex->default_value, lex->on_update_value, - &lex->comment, - lex->change,&lex->interval_list,lex->charset, - lex->uint_geom_type)) - MYSQL_YYABORT; - }; + field_ident + { + LEX *lex=Lex; + lex->length=lex->dec=0; + lex->type=0; + lex->default_value= lex->on_update_value= 0; + lex->comment=null_lex_str; + lex->charset=NULL; + } + type opt_attribute + { + LEX *lex=Lex; + if (add_field_to_list(lex->thd, &$1, (enum enum_field_types) $3, + lex->length,lex->dec,lex->type, + lex->default_value, lex->on_update_value, + &lex->comment, + lex->change,&lex->interval_list,lex->charset, + lex->uint_geom_type)) + MYSQL_YYABORT; + } + ; type: - int_type opt_len field_options { $$=$1; } - | real_type opt_precision field_options { $$=$1; } - | FLOAT_SYM float_options field_options { $$=MYSQL_TYPE_FLOAT; } - | BIT_SYM { Lex->length= (char*) "1"; - $$=MYSQL_TYPE_BIT; } - | BIT_SYM '(' NUM ')' { Lex->length= $3.str; - $$=MYSQL_TYPE_BIT; } - | BOOL_SYM { Lex->length=(char*) "1"; - $$=MYSQL_TYPE_TINY; } - | BOOLEAN_SYM { Lex->length=(char*) "1"; - $$=MYSQL_TYPE_TINY; } - | char '(' NUM ')' opt_binary { Lex->length=$3.str; - $$=MYSQL_TYPE_STRING; } - | char opt_binary { Lex->length=(char*) "1"; - $$=MYSQL_TYPE_STRING; } - | nchar '(' NUM ')' opt_bin_mod { Lex->length=$3.str; - $$=MYSQL_TYPE_STRING; - Lex->charset=national_charset_info; } - | nchar opt_bin_mod { Lex->length=(char*) "1"; - $$=MYSQL_TYPE_STRING; - Lex->charset=national_charset_info; } - | BINARY '(' NUM ')' { Lex->length=$3.str; - Lex->charset=&my_charset_bin; - $$=MYSQL_TYPE_STRING; } - | BINARY { Lex->length= (char*) "1"; - Lex->charset=&my_charset_bin; - $$=MYSQL_TYPE_STRING; } - | varchar '(' NUM ')' opt_binary { Lex->length=$3.str; - $$= MYSQL_TYPE_VARCHAR; } - | nvarchar '(' NUM ')' opt_bin_mod { Lex->length=$3.str; - $$= MYSQL_TYPE_VARCHAR; - Lex->charset=national_charset_info; } - | VARBINARY '(' NUM ')' { Lex->length=$3.str; - Lex->charset=&my_charset_bin; - $$= MYSQL_TYPE_VARCHAR; } - | YEAR_SYM opt_len field_options { $$=MYSQL_TYPE_YEAR; } - | DATE_SYM { $$=MYSQL_TYPE_DATE; } - | TIME_SYM { $$=MYSQL_TYPE_TIME; } - | TIMESTAMP opt_len - { - if (YYTHD->variables.sql_mode & MODE_MAXDB) - $$=MYSQL_TYPE_DATETIME; - else + int_type opt_len field_options { $$=$1; } + | real_type opt_precision field_options { $$=$1; } + | FLOAT_SYM float_options field_options { $$=MYSQL_TYPE_FLOAT; } + | BIT_SYM + { + Lex->length= (char*) "1"; + $$=MYSQL_TYPE_BIT; + } + | BIT_SYM '(' NUM ')' + { + Lex->length= $3.str; + $$=MYSQL_TYPE_BIT; + } + | BOOL_SYM + { + Lex->length=(char*) "1"; + $$=MYSQL_TYPE_TINY; + } + | BOOLEAN_SYM + { + Lex->length=(char*) "1"; + $$=MYSQL_TYPE_TINY; + } + | char '(' NUM ')' opt_binary + { + Lex->length=$3.str; + $$=MYSQL_TYPE_STRING; + } + | char opt_binary + { + Lex->length=(char*) "1"; + $$=MYSQL_TYPE_STRING; + } + | nchar '(' NUM ')' opt_bin_mod + { + Lex->length=$3.str; + $$=MYSQL_TYPE_STRING; + Lex->charset=national_charset_info; + } + | nchar opt_bin_mod + { + Lex->length=(char*) "1"; + $$=MYSQL_TYPE_STRING; + Lex->charset=national_charset_info; + } + | BINARY '(' NUM ')' + { + Lex->length=$3.str; + Lex->charset=&my_charset_bin; + $$=MYSQL_TYPE_STRING; + } + | BINARY + { + Lex->length= (char*) "1"; + Lex->charset=&my_charset_bin; + $$=MYSQL_TYPE_STRING; + } + | varchar '(' NUM ')' opt_binary + { + Lex->length=$3.str; + $$= MYSQL_TYPE_VARCHAR; + } + | nvarchar '(' NUM ')' opt_bin_mod + { + Lex->length=$3.str; + $$= MYSQL_TYPE_VARCHAR; + Lex->charset=national_charset_info; + } + | VARBINARY '(' NUM ')' + { + Lex->length=$3.str; + Lex->charset=&my_charset_bin; + $$= MYSQL_TYPE_VARCHAR; + } + | YEAR_SYM opt_len field_options + { $$=MYSQL_TYPE_YEAR; } + | DATE_SYM + { $$=MYSQL_TYPE_DATE; } + | TIME_SYM + { $$=MYSQL_TYPE_TIME; } + | TIMESTAMP opt_len + { + if (YYTHD->variables.sql_mode & MODE_MAXDB) + $$=MYSQL_TYPE_DATETIME; + else { /* Unlike other types TIMESTAMP fields are NOT NULL by default. */ Lex->type|= NOT_NULL_FLAG; - $$=MYSQL_TYPE_TIMESTAMP; + $$=MYSQL_TYPE_TIMESTAMP; } - } - | DATETIME { $$=MYSQL_TYPE_DATETIME; } - | TINYBLOB { Lex->charset=&my_charset_bin; - $$=MYSQL_TYPE_TINY_BLOB; } - | BLOB_SYM opt_len { Lex->charset=&my_charset_bin; - $$=MYSQL_TYPE_BLOB; } - | spatial_type + } + | DATETIME + { $$=MYSQL_TYPE_DATETIME; } + | TINYBLOB + { + Lex->charset=&my_charset_bin; + $$=MYSQL_TYPE_TINY_BLOB; + } + | BLOB_SYM opt_len + { + Lex->charset=&my_charset_bin; + $$=MYSQL_TYPE_BLOB; + } + | spatial_type { #ifdef HAVE_SPATIAL Lex->charset=&my_charset_bin; @@ -4642,379 +4823,439 @@ type: MYSQL_YYABORT; #endif } - | MEDIUMBLOB { Lex->charset=&my_charset_bin; - $$=MYSQL_TYPE_MEDIUM_BLOB; } - | LONGBLOB { Lex->charset=&my_charset_bin; - $$=MYSQL_TYPE_LONG_BLOB; } - | LONG_SYM VARBINARY { Lex->charset=&my_charset_bin; - $$=MYSQL_TYPE_MEDIUM_BLOB; } - | LONG_SYM varchar opt_binary { $$=MYSQL_TYPE_MEDIUM_BLOB; } - | TINYTEXT opt_binary { $$=MYSQL_TYPE_TINY_BLOB; } - | TEXT_SYM opt_len opt_binary { $$=MYSQL_TYPE_BLOB; } - | MEDIUMTEXT opt_binary { $$=MYSQL_TYPE_MEDIUM_BLOB; } - | LONGTEXT opt_binary { $$=MYSQL_TYPE_LONG_BLOB; } - | DECIMAL_SYM float_options field_options - { $$=MYSQL_TYPE_NEWDECIMAL;} - | NUMERIC_SYM float_options field_options - { $$=MYSQL_TYPE_NEWDECIMAL;} - | FIXED_SYM float_options field_options - { $$=MYSQL_TYPE_NEWDECIMAL;} - | ENUM {Lex->interval_list.empty();} '(' string_list ')' opt_binary - { $$=MYSQL_TYPE_ENUM; } - | SET { Lex->interval_list.empty();} '(' string_list ')' opt_binary - { $$=MYSQL_TYPE_SET; } - | LONG_SYM opt_binary { $$=MYSQL_TYPE_MEDIUM_BLOB; } - | SERIAL_SYM - { - $$=MYSQL_TYPE_LONGLONG; - Lex->type|= (AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNSIGNED_FLAG | - UNIQUE_FLAG); - } - ; + | MEDIUMBLOB + { + Lex->charset=&my_charset_bin; + $$=MYSQL_TYPE_MEDIUM_BLOB; + } + | LONGBLOB + { + Lex->charset=&my_charset_bin; + $$=MYSQL_TYPE_LONG_BLOB; + } + | LONG_SYM VARBINARY + { + Lex->charset=&my_charset_bin; + $$=MYSQL_TYPE_MEDIUM_BLOB; + } + | LONG_SYM varchar opt_binary + { $$=MYSQL_TYPE_MEDIUM_BLOB; } + | TINYTEXT opt_binary + { $$=MYSQL_TYPE_TINY_BLOB; } + | TEXT_SYM opt_len opt_binary + { $$=MYSQL_TYPE_BLOB; } + | MEDIUMTEXT opt_binary + { $$=MYSQL_TYPE_MEDIUM_BLOB; } + | LONGTEXT opt_binary + { $$=MYSQL_TYPE_LONG_BLOB; } + | DECIMAL_SYM float_options field_options + { $$=MYSQL_TYPE_NEWDECIMAL;} + | NUMERIC_SYM float_options field_options + { $$=MYSQL_TYPE_NEWDECIMAL;} + | FIXED_SYM float_options field_options + { $$=MYSQL_TYPE_NEWDECIMAL;} + | ENUM + {Lex->interval_list.empty();} + '(' string_list ')' opt_binary + { $$=MYSQL_TYPE_ENUM; } + | SET + { Lex->interval_list.empty();} + '(' string_list ')' opt_binary + { $$=MYSQL_TYPE_SET; } + | LONG_SYM opt_binary + { $$=MYSQL_TYPE_MEDIUM_BLOB; } + | SERIAL_SYM + { + $$=MYSQL_TYPE_LONGLONG; + Lex->type|= (AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNSIGNED_FLAG | + UNIQUE_FLAG); + } + ; spatial_type: - GEOMETRY_SYM { $$= Field::GEOM_GEOMETRY; } - | GEOMETRYCOLLECTION { $$= Field::GEOM_GEOMETRYCOLLECTION; } - | POINT_SYM { Lex->length= (char*)"21"; - $$= Field::GEOM_POINT; - } - | MULTIPOINT { $$= Field::GEOM_MULTIPOINT; } - | LINESTRING { $$= Field::GEOM_LINESTRING; } - | MULTILINESTRING { $$= Field::GEOM_MULTILINESTRING; } - | POLYGON { $$= Field::GEOM_POLYGON; } - | MULTIPOLYGON { $$= Field::GEOM_MULTIPOLYGON; } - ; + GEOMETRY_SYM { $$= Field::GEOM_GEOMETRY; } + | GEOMETRYCOLLECTION { $$= Field::GEOM_GEOMETRYCOLLECTION; } + | POINT_SYM + { + Lex->length= (char*)"21"; + $$= Field::GEOM_POINT; + } + | MULTIPOINT { $$= Field::GEOM_MULTIPOINT; } + | LINESTRING { $$= Field::GEOM_LINESTRING; } + | MULTILINESTRING { $$= Field::GEOM_MULTILINESTRING; } + | POLYGON { $$= Field::GEOM_POLYGON; } + | MULTIPOLYGON { $$= Field::GEOM_MULTIPOLYGON; } + ; char: - CHAR_SYM {} - ; + CHAR_SYM {} + ; nchar: - NCHAR_SYM {} - | NATIONAL_SYM CHAR_SYM {} - ; + NCHAR_SYM {} + | NATIONAL_SYM CHAR_SYM {} + ; varchar: - char VARYING {} - | VARCHAR {} - ; + char VARYING {} + | VARCHAR {} + ; nvarchar: - NATIONAL_SYM VARCHAR {} - | NVARCHAR_SYM {} - | NCHAR_SYM VARCHAR {} - | NATIONAL_SYM CHAR_SYM VARYING {} - | NCHAR_SYM VARYING {} - ; + NATIONAL_SYM VARCHAR {} + | NVARCHAR_SYM {} + | NCHAR_SYM VARCHAR {} + | NATIONAL_SYM CHAR_SYM VARYING {} + | NCHAR_SYM VARYING {} + ; int_type: - INT_SYM { $$=MYSQL_TYPE_LONG; } - | TINYINT { $$=MYSQL_TYPE_TINY; } - | SMALLINT { $$=MYSQL_TYPE_SHORT; } - | MEDIUMINT { $$=MYSQL_TYPE_INT24; } - | BIGINT { $$=MYSQL_TYPE_LONGLONG; }; + INT_SYM { $$=MYSQL_TYPE_LONG; } + | TINYINT { $$=MYSQL_TYPE_TINY; } + | SMALLINT { $$=MYSQL_TYPE_SHORT; } + | MEDIUMINT { $$=MYSQL_TYPE_INT24; } + | BIGINT { $$=MYSQL_TYPE_LONGLONG; } + ; real_type: - REAL { $$= YYTHD->variables.sql_mode & MODE_REAL_AS_FLOAT ? - MYSQL_TYPE_FLOAT : MYSQL_TYPE_DOUBLE; } - | DOUBLE_SYM { $$=MYSQL_TYPE_DOUBLE; } - | DOUBLE_SYM PRECISION { $$=MYSQL_TYPE_DOUBLE; }; - + REAL + { + $$= YYTHD->variables.sql_mode & MODE_REAL_AS_FLOAT ? + MYSQL_TYPE_FLOAT : MYSQL_TYPE_DOUBLE; + } + | DOUBLE_SYM + { $$=MYSQL_TYPE_DOUBLE; } + | DOUBLE_SYM PRECISION + { $$=MYSQL_TYPE_DOUBLE; } + ; float_options: - /* empty */ { Lex->dec=Lex->length= (char*)0; } - | '(' NUM ')' { Lex->length=$2.str; Lex->dec= (char*)0; } - | precision {}; + /* empty */ + { Lex->dec=Lex->length= (char*)0; } + | '(' NUM ')' + { Lex->length=$2.str; Lex->dec= (char*)0; } + | precision + {} + ; precision: - '(' NUM ',' NUM ')' - { - LEX *lex=Lex; - lex->length=$2.str; lex->dec=$4.str; - }; + '(' NUM ',' NUM ')' + { + LEX *lex=Lex; + lex->length=$2.str; + lex->dec=$4.str; + } + ; field_options: - /* empty */ {} - | field_opt_list {}; + /* empty */ {} + | field_opt_list {} + ; field_opt_list: - field_opt_list field_option {} - | field_option {}; + field_opt_list field_option {} + | field_option {} + ; field_option: - SIGNED_SYM {} - | UNSIGNED { Lex->type|= UNSIGNED_FLAG;} - | ZEROFILL { Lex->type|= UNSIGNED_FLAG | ZEROFILL_FLAG; }; + SIGNED_SYM {} + | UNSIGNED { Lex->type|= UNSIGNED_FLAG;} + | ZEROFILL { Lex->type|= UNSIGNED_FLAG | ZEROFILL_FLAG; } + ; opt_len: - /* empty */ { Lex->length=(char*) 0; } /* use default length */ - | '(' NUM ')' { Lex->length= $2.str; }; + /* empty */ { Lex->length=(char*) 0; /* use default length */ } + | '(' NUM ')' { Lex->length= $2.str; } + ; opt_precision: - /* empty */ {} - | precision {}; + /* empty */ {} + | precision {} + ; opt_attribute: - /* empty */ {} - | opt_attribute_list {}; + /* empty */ {} + | opt_attribute_list {} + ; opt_attribute_list: - opt_attribute_list attribute {} - | attribute; + opt_attribute_list attribute {} + | attribute + ; attribute: - NULL_SYM { Lex->type&= ~ NOT_NULL_FLAG; } - | not NULL_SYM { Lex->type|= NOT_NULL_FLAG; } - | DEFAULT now_or_signed_literal { Lex->default_value=$2; } - | ON UPDATE_SYM NOW_SYM optional_braces + NULL_SYM { Lex->type&= ~ NOT_NULL_FLAG; } + | not NULL_SYM { Lex->type|= NOT_NULL_FLAG; } + | DEFAULT now_or_signed_literal { Lex->default_value=$2; } + | ON UPDATE_SYM NOW_SYM optional_braces { Lex->on_update_value= new Item_func_now_local(); } - | AUTO_INC { Lex->type|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG; } - | SERIAL_SYM DEFAULT VALUE_SYM - { - LEX *lex=Lex; - lex->type|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNIQUE_FLAG; - lex->alter_info.flags|= ALTER_ADD_INDEX; - } - | opt_primary KEY_SYM - { - LEX *lex=Lex; - lex->type|= PRI_KEY_FLAG | NOT_NULL_FLAG; - lex->alter_info.flags|= ALTER_ADD_INDEX; - } - | UNIQUE_SYM - { - LEX *lex=Lex; - lex->type|= UNIQUE_FLAG; - lex->alter_info.flags|= ALTER_ADD_INDEX; - } - | UNIQUE_SYM KEY_SYM - { - LEX *lex=Lex; - lex->type|= UNIQUE_KEY_FLAG; - lex->alter_info.flags|= ALTER_ADD_INDEX; - } - | COMMENT_SYM TEXT_STRING_sys { Lex->comment= $2; } - | COLLATE_SYM collation_name - { - if (Lex->charset && !my_charset_same(Lex->charset,$2)) - { - my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0), + | AUTO_INC { Lex->type|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG; } + | SERIAL_SYM DEFAULT VALUE_SYM + { + LEX *lex=Lex; + lex->type|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNIQUE_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } + | opt_primary KEY_SYM + { + LEX *lex=Lex; + lex->type|= PRI_KEY_FLAG | NOT_NULL_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } + | UNIQUE_SYM + { + LEX *lex=Lex; + lex->type|= UNIQUE_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } + | UNIQUE_SYM KEY_SYM + { + LEX *lex=Lex; + lex->type|= UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } + | COMMENT_SYM TEXT_STRING_sys { Lex->comment= $2; } + | COLLATE_SYM collation_name + { + if (Lex->charset && !my_charset_same(Lex->charset,$2)) + { + my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0), $2->name,Lex->charset->csname); - MYSQL_YYABORT; - } - else - { - Lex->charset=$2; - } - } - ; + MYSQL_YYABORT; + } + else + { + Lex->charset=$2; + } + } + ; now_or_signed_literal: - NOW_SYM optional_braces { $$= new Item_func_now_local(); } - | signed_literal { $$=$1; } + NOW_SYM optional_braces + { $$= new Item_func_now_local(); } + | signed_literal + { $$=$1; } ; charset: - CHAR_SYM SET {} - | CHARSET {} - ; + CHAR_SYM SET {} + | CHARSET {} + ; charset_name: - ident_or_text - { - if (!($$=get_charset_by_csname($1.str,MY_CS_PRIMARY,MYF(0)))) - { - my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), $1.str); - MYSQL_YYABORT; - } - } - | BINARY { $$= &my_charset_bin; } - ; + ident_or_text + { + if (!($$=get_charset_by_csname($1.str,MY_CS_PRIMARY,MYF(0)))) + { + my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), $1.str); + MYSQL_YYABORT; + } + } + | BINARY { $$= &my_charset_bin; } + ; charset_name_or_default: - charset_name { $$=$1; } - | DEFAULT { $$=NULL; } ; + charset_name { $$=$1; } + | DEFAULT { $$=NULL; } + ; opt_load_data_charset: - /* Empty */ { $$= NULL; } - | charset charset_name_or_default { $$= $2; } - ; + /* Empty */ { $$= NULL; } + | charset charset_name_or_default { $$= $2; } + ; old_or_new_charset_name: - ident_or_text - { - if (!($$=get_charset_by_csname($1.str,MY_CS_PRIMARY,MYF(0))) && - !($$=get_old_charset_by_name($1.str))) - { - my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), $1.str); - MYSQL_YYABORT; - } - } - | BINARY { $$= &my_charset_bin; } - ; + ident_or_text + { + if (!($$=get_charset_by_csname($1.str,MY_CS_PRIMARY,MYF(0))) && + !($$=get_old_charset_by_name($1.str))) + { + my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), $1.str); + MYSQL_YYABORT; + } + } + | BINARY { $$= &my_charset_bin; } + ; old_or_new_charset_name_or_default: - old_or_new_charset_name { $$=$1; } - | DEFAULT { $$=NULL; } ; + old_or_new_charset_name { $$=$1; } + | DEFAULT { $$=NULL; } + ; collation_name: - ident_or_text - { - if (!($$=get_charset_by_name($1.str,MYF(0)))) - { - my_error(ER_UNKNOWN_COLLATION, MYF(0), $1.str); - MYSQL_YYABORT; - } - }; + ident_or_text + { + if (!($$=get_charset_by_name($1.str,MYF(0)))) + { + my_error(ER_UNKNOWN_COLLATION, MYF(0), $1.str); + MYSQL_YYABORT; + } + } + ; opt_collate: - /* empty */ { $$=NULL; } - | COLLATE_SYM collation_name_or_default { $$=$2; } - ; + /* empty */ { $$=NULL; } + | COLLATE_SYM collation_name_or_default { $$=$2; } + ; collation_name_or_default: - collation_name { $$=$1; } - | DEFAULT { $$=NULL; } ; + collation_name { $$=$1; } + | DEFAULT { $$=NULL; } + ; opt_default: - /* empty */ {} - | DEFAULT {}; + /* empty */ {} + | DEFAULT {} + ; opt_binary: - /* empty */ { Lex->charset=NULL; } - | ASCII_SYM opt_bin_mod { Lex->charset=&my_charset_latin1; } - | BYTE_SYM { Lex->charset=&my_charset_bin; } - | UNICODE_SYM opt_bin_mod - { - if (!(Lex->charset=get_charset_by_csname("ucs2", - MY_CS_PRIMARY,MYF(0)))) - { - my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), "ucs2"); - MYSQL_YYABORT; - } - } - | charset charset_name opt_bin_mod { Lex->charset=$2; } - | BINARY opt_bin_charset { Lex->type|= BINCMP_FLAG; }; + /* empty */ { Lex->charset=NULL; } + | ASCII_SYM opt_bin_mod { Lex->charset=&my_charset_latin1; } + | BYTE_SYM { Lex->charset=&my_charset_bin; } + | UNICODE_SYM opt_bin_mod + { + if (!(Lex->charset=get_charset_by_csname("ucs2", + MY_CS_PRIMARY,MYF(0)))) + { + my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), "ucs2"); + MYSQL_YYABORT; + } + } + | charset charset_name opt_bin_mod { Lex->charset=$2; } + | BINARY opt_bin_charset { Lex->type|= BINCMP_FLAG; } + ; opt_bin_mod: - /* empty */ { } - | BINARY { Lex->type|= BINCMP_FLAG; }; + /* empty */ { } + | BINARY { Lex->type|= BINCMP_FLAG; } + ; opt_bin_charset: - /* empty */ { Lex->charset= NULL; } - | ASCII_SYM { Lex->charset=&my_charset_latin1; } - | UNICODE_SYM - { - if (!(Lex->charset=get_charset_by_csname("ucs2", - MY_CS_PRIMARY,MYF(0)))) - { - my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), "ucs2"); - MYSQL_YYABORT; - } - } - | charset charset_name { Lex->charset=$2; } ; + /* empty */ { Lex->charset= NULL; } + | ASCII_SYM { Lex->charset=&my_charset_latin1; } + | UNICODE_SYM + { + if (!(Lex->charset=get_charset_by_csname("ucs2", + MY_CS_PRIMARY,MYF(0)))) + { + my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), "ucs2"); + MYSQL_YYABORT; + } + } + | charset charset_name { Lex->charset=$2; } + ; opt_primary: - /* empty */ - | PRIMARY_SYM - ; + /* empty */ + | PRIMARY_SYM + ; references: - REFERENCES table_ident - { - LEX *lex=Lex; - lex->fk_delete_opt= lex->fk_update_opt= lex->fk_match_option= 0; - lex->ref_list.empty(); - } - opt_ref_list - { - $$=$2; - }; + REFERENCES table_ident + { + LEX *lex=Lex; + lex->fk_delete_opt= lex->fk_update_opt= lex->fk_match_option= 0; + lex->ref_list.empty(); + } + opt_ref_list + { + $$=$2; + } + ; opt_ref_list: - /* empty */ opt_on_delete {} - | '(' ref_list ')' opt_on_delete {}; + /* empty */ opt_on_delete {} + | '(' ref_list ')' opt_on_delete {} + ; ref_list: - ref_list ',' ident { Lex->ref_list.push_back(new Key_part_spec($3.str)); } - | ident { Lex->ref_list.push_back(new Key_part_spec($1.str)); }; - + ref_list ',' ident { Lex->ref_list.push_back(new Key_part_spec($3.str)); } + | ident { Lex->ref_list.push_back(new Key_part_spec($1.str)); } + ; opt_on_delete: - /* empty */ {} - | opt_on_delete_list {}; + /* empty */ {} + | opt_on_delete_list {} + ; opt_on_delete_list: - opt_on_delete_list opt_on_delete_item {} - | opt_on_delete_item {}; + opt_on_delete_list opt_on_delete_item {} + | opt_on_delete_item {} + ; opt_on_delete_item: - ON DELETE_SYM delete_option { Lex->fk_delete_opt= $3; } - | ON UPDATE_SYM delete_option { Lex->fk_update_opt= $3; } - | MATCH FULL { Lex->fk_match_option= Foreign_key::FK_MATCH_FULL; } - | MATCH PARTIAL { Lex->fk_match_option= Foreign_key::FK_MATCH_PARTIAL; } - | MATCH SIMPLE_SYM { Lex->fk_match_option= Foreign_key::FK_MATCH_SIMPLE; }; + ON DELETE_SYM delete_option { Lex->fk_delete_opt= $3; } + | ON UPDATE_SYM delete_option { Lex->fk_update_opt= $3; } + | MATCH FULL { Lex->fk_match_option= Foreign_key::FK_MATCH_FULL; } + | MATCH PARTIAL { Lex->fk_match_option= Foreign_key::FK_MATCH_PARTIAL; } + | MATCH SIMPLE_SYM { Lex->fk_match_option= Foreign_key::FK_MATCH_SIMPLE; } + ; delete_option: - RESTRICT { $$= (int) Foreign_key::FK_OPTION_RESTRICT; } - | CASCADE { $$= (int) Foreign_key::FK_OPTION_CASCADE; } - | SET NULL_SYM { $$= (int) Foreign_key::FK_OPTION_SET_NULL; } - | NO_SYM ACTION { $$= (int) Foreign_key::FK_OPTION_NO_ACTION; } - | SET DEFAULT { $$= (int) Foreign_key::FK_OPTION_DEFAULT; }; + RESTRICT { $$= (int) Foreign_key::FK_OPTION_RESTRICT; } + | CASCADE { $$= (int) Foreign_key::FK_OPTION_CASCADE; } + | SET NULL_SYM { $$= (int) Foreign_key::FK_OPTION_SET_NULL; } + | NO_SYM ACTION { $$= (int) Foreign_key::FK_OPTION_NO_ACTION; } + | SET DEFAULT { $$= (int) Foreign_key::FK_OPTION_DEFAULT; } + ; key_type: - key_or_index { $$= Key::MULTIPLE; } - | FULLTEXT_SYM opt_key_or_index { $$= Key::FULLTEXT; } - | SPATIAL_SYM opt_key_or_index - { + key_or_index { $$= Key::MULTIPLE; } + | FULLTEXT_SYM opt_key_or_index { $$= Key::FULLTEXT; } + | SPATIAL_SYM opt_key_or_index + { #ifdef HAVE_SPATIAL - $$= Key::SPATIAL; -#else - my_error(ER_FEATURE_DISABLED, MYF(0), - sym_group_geom.name, sym_group_geom.needed_define); - MYSQL_YYABORT; -#endif - }; - -constraint_key_type: - PRIMARY_SYM KEY_SYM { $$= Key::PRIMARY; } - | UNIQUE_SYM opt_key_or_index { $$= Key::UNIQUE; }; - -key_or_index: - KEY_SYM {} - | INDEX_SYM {}; - -opt_key_or_index: - /* empty */ {} - | key_or_index - ; - -keys_or_index: - KEYS {} - | INDEX_SYM {} - | INDEXES {}; - -opt_unique_or_fulltext: - /* empty */ { $$= Key::MULTIPLE; } - | UNIQUE_SYM { $$= Key::UNIQUE; } - | FULLTEXT_SYM { $$= Key::FULLTEXT;} - | SPATIAL_SYM - { -#ifdef HAVE_SPATIAL - $$= Key::SPATIAL; + $$= Key::SPATIAL; #else my_error(ER_FEATURE_DISABLED, MYF(0), sym_group_geom.name, sym_group_geom.needed_define); - MYSQL_YYABORT; + MYSQL_YYABORT; #endif - } + } + ; + +constraint_key_type: + PRIMARY_SYM KEY_SYM { $$= Key::PRIMARY; } + | UNIQUE_SYM opt_key_or_index { $$= Key::UNIQUE; } + ; + +key_or_index: + KEY_SYM {} + | INDEX_SYM {} + ; + +opt_key_or_index: + /* empty */ {} + | key_or_index + ; + +keys_or_index: + KEYS {} + | INDEX_SYM {} + | INDEXES {} + ; + +opt_unique_or_fulltext: + /* empty */ { $$= Key::MULTIPLE; } + | UNIQUE_SYM { $$= Key::UNIQUE; } + | FULLTEXT_SYM { $$= Key::FULLTEXT;} + | SPATIAL_SYM + { +#ifdef HAVE_SPATIAL + $$= Key::SPATIAL; +#else + my_error(ER_FEATURE_DISABLED, MYF(0), + sym_group_geom.name, sym_group_geom.needed_define); + MYSQL_YYABORT; +#endif + } ; init_key_options: - { - Lex->key_create_info= default_key_create_info; - } - ; + { + Lex->key_create_info= default_key_create_info; + } + ; /* For now, key_alg initializies lex->key_create_info. @@ -5023,30 +5264,30 @@ init_key_options: */ key_alg: - /* empty */ init_key_options - | init_key_options key_using_alg - ; + init_key_options + | init_key_options key_using_alg + ; key_options: - /* empty */ {} - | key_opts - ; + /* empty */ {} + | key_opts + ; key_opts: - key_opt - | key_opts key_opt - ; + key_opt + | key_opts key_opt + ; key_using_alg: - USING btree_or_rtree { Lex->key_create_info.algorithm= $2; } - | TYPE_SYM btree_or_rtree { Lex->key_create_info.algorithm= $2; } + USING btree_or_rtree { Lex->key_create_info.algorithm= $2; } + | TYPE_SYM btree_or_rtree { Lex->key_create_info.algorithm= $2; } ; key_opt: - key_using_alg - | KEY_BLOCK_SIZE opt_equal ulong_num - { Lex->key_create_info.block_size= $3; } - | WITH PARSER_SYM IDENT_sys + key_using_alg + | KEY_BLOCK_SIZE opt_equal ulong_num + { Lex->key_create_info.block_size= $3; } + | WITH PARSER_SYM IDENT_sys { if (plugin_is_ready(&$3, MYSQL_FTPARSER_PLUGIN)) Lex->key_create_info.parser_name= $3; @@ -5058,126 +5299,127 @@ key_opt: } ; - btree_or_rtree: - BTREE_SYM { $$= HA_KEY_ALG_BTREE; } - | RTREE_SYM - { - $$= HA_KEY_ALG_RTREE; - } - | HASH_SYM { $$= HA_KEY_ALG_HASH; }; + BTREE_SYM { $$= HA_KEY_ALG_BTREE; } + | RTREE_SYM { $$= HA_KEY_ALG_RTREE; } + | HASH_SYM { $$= HA_KEY_ALG_HASH; } + ; key_list: - key_list ',' key_part order_dir { Lex->col_list.push_back($3); } - | key_part order_dir { Lex->col_list.push_back($1); }; + key_list ',' key_part order_dir { Lex->col_list.push_back($3); } + | key_part order_dir { Lex->col_list.push_back($1); } + ; key_part: - ident { $$=new Key_part_spec($1.str); } - | ident '(' NUM ')' - { - int key_part_len= atoi($3.str); - if (!key_part_len) + ident { $$=new Key_part_spec($1.str); } + | ident '(' NUM ')' { - my_error(ER_KEY_PART_0, MYF(0), $1.str); + int key_part_len= atoi($3.str); + if (!key_part_len) + { + my_error(ER_KEY_PART_0, MYF(0), $1.str); + } + $$=new Key_part_spec($1.str,(uint) key_part_len); } - $$=new Key_part_spec($1.str,(uint) key_part_len); - }; + ; opt_ident: - /* empty */ { $$=(char*) 0; } /* Defaultlength */ - | field_ident { $$=$1.str; }; + /* empty */ { $$=(char*) 0; /* Default length */ } + | field_ident { $$=$1.str; } + ; opt_component: - /* empty */ { $$= null_lex_str; } - | '.' ident { $$= $2; }; + /* empty */ { $$= null_lex_str; } + | '.' ident { $$= $2; } + ; string_list: - text_string { Lex->interval_list.push_back($1); } - | string_list ',' text_string { Lex->interval_list.push_back($3); }; + text_string { Lex->interval_list.push_back($1); } + | string_list ',' text_string { Lex->interval_list.push_back($3); }; /* ** Alter table */ alter: - ALTER opt_ignore TABLE_SYM table_ident - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - lex->name.str= 0; - lex->name.length= 0; - lex->sql_command= SQLCOM_ALTER_TABLE; - lex->duplicates= DUP_ERROR; - if (!lex->select_lex.add_table_to_list(thd, $4, NULL, - TL_OPTION_UPDATING)) - MYSQL_YYABORT; - lex->alter_info.reset(); - lex->col_list.empty(); - lex->select_lex.init_order(); - lex->select_lex.db= - ((TABLE_LIST*) lex->select_lex.table_list.first)->db; - bzero((char*) &lex->create_info,sizeof(lex->create_info)); - lex->create_info.db_type= 0; - lex->create_info.default_table_charset= NULL; - lex->create_info.row_type= ROW_TYPE_NOT_USED; - lex->alter_info.reset(); - lex->no_write_to_binlog= 0; - lex->create_info.storage_media= HA_SM_DEFAULT; - } - alter_commands - {} - | ALTER DATABASE ident_or_empty + ALTER opt_ignore TABLE_SYM table_ident + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + lex->name.str= 0; + lex->name.length= 0; + lex->sql_command= SQLCOM_ALTER_TABLE; + lex->duplicates= DUP_ERROR; + if (!lex->select_lex.add_table_to_list(thd, $4, NULL, + TL_OPTION_UPDATING)) + MYSQL_YYABORT; + lex->alter_info.reset(); + lex->col_list.empty(); + lex->select_lex.init_order(); + lex->select_lex.db= + ((TABLE_LIST*) lex->select_lex.table_list.first)->db; + bzero((char*) &lex->create_info,sizeof(lex->create_info)); + lex->create_info.db_type= 0; + lex->create_info.default_table_charset= NULL; + lex->create_info.row_type= ROW_TYPE_NOT_USED; + lex->alter_info.reset(); + lex->no_write_to_binlog= 0; + lex->create_info.storage_media= HA_SM_DEFAULT; + } + alter_commands + {} + | ALTER DATABASE ident_or_empty { Lex->create_info.default_table_charset= NULL; Lex->create_info.used_fields= 0; } create_database_options - { - LEX *lex=Lex; - lex->sql_command=SQLCOM_ALTER_DB; - lex->name= $3; + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_ALTER_DB; + lex->name= $3; if (lex->name.str == NULL && lex->copy_db_to(&lex->name.str, &lex->name.length)) MYSQL_YYABORT; - } - | ALTER PROCEDURE sp_name - { - LEX *lex= Lex; - - if (lex->sphead) - { - my_error(ER_SP_NO_DROP_SP, MYF(0), "PROCEDURE"); - MYSQL_YYABORT; - } - bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics)); } - sp_a_chistics - { - LEX *lex=Lex; + | ALTER PROCEDURE sp_name + { + LEX *lex= Lex; - lex->sql_command= SQLCOM_ALTER_PROCEDURE; - lex->spname= $3; - } - | ALTER FUNCTION_SYM sp_name - { - LEX *lex= Lex; - - if (lex->sphead) - { - my_error(ER_SP_NO_DROP_SP, MYF(0), "FUNCTION"); - MYSQL_YYABORT; - } - bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics)); + if (lex->sphead) + { + my_error(ER_SP_NO_DROP_SP, MYF(0), "PROCEDURE"); + MYSQL_YYABORT; + } + bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics)); } - sp_a_chistics - { - LEX *lex=Lex; + sp_a_chistics + { + LEX *lex=Lex; - lex->sql_command= SQLCOM_ALTER_FUNCTION; - lex->spname= $3; - } + lex->sql_command= SQLCOM_ALTER_PROCEDURE; + lex->spname= $3; + } + | ALTER FUNCTION_SYM sp_name + { + LEX *lex= Lex; + + if (lex->sphead) + { + my_error(ER_SP_NO_DROP_SP, MYF(0), "FUNCTION"); + MYSQL_YYABORT; + } + bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics)); + } + sp_a_chistics + { + LEX *lex=Lex; + + lex->sql_command= SQLCOM_ALTER_FUNCTION; + lex->spname= $3; + } | ALTER view_algorithm definer - { + { LEX *lex= Lex; if (lex->sphead) @@ -5204,11 +5446,11 @@ alter: MYSQL_YYABORT; } lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED; - lex->create_view_mode= VIEW_ALTER; - } + lex->create_view_mode= VIEW_ALTER; + } view_tail - {} - | ALTER definer EVENT_SYM sp_name + {} + | ALTER definer EVENT_SYM sp_name /* BE CAREFUL when you add a new rule to update the block where YYTHD->client_capabilities is set back to original value @@ -5253,7 +5495,7 @@ alter: if (!($6 || $7 || $8 || $9 || $10)) { - my_parse_error(ER(ER_SYNTAX_ERROR)); + my_parse_error(ER(ER_SYNTAX_ERROR)); MYSQL_YYABORT; } /* @@ -5289,15 +5531,17 @@ alter: lex->server_options.server_name= $3.str; lex->server_options.server_name_length= $3.length; } - ; + ; -ev_alter_on_schedule_completion: /* empty */ { $$= 0;} +ev_alter_on_schedule_completion: + /* empty */ { $$= 0;} | ON SCHEDULE_SYM ev_schedule_time { $$= 1; } | ev_on_completion { $$= 1; } | ON SCHEDULE_SYM ev_schedule_time ev_on_completion { $$= 1; } - ; + ; -opt_ev_rename_to: /* empty */ { $$= 0;} +opt_ev_rename_to: + /* empty */ { $$= 0;} | RENAME TO_SYM sp_name { /* @@ -5307,19 +5551,22 @@ opt_ev_rename_to: /* empty */ { $$= 0;} Lex->spname= $3; $$= 1; } - ; + ; -opt_ev_sql_stmt: /* empty*/ { $$= 0;} +opt_ev_sql_stmt: + /* empty*/ { $$= 0;} | DO_SYM ev_sql_stmt { $$= 1; } ; ident_or_empty: - /* empty */ { $$.str= 0; $$.length= 0; } - | ident { $$= $1; }; + /* empty */ { $$.str= 0; $$.length= 0; } + | ident { $$= $1; } + ; alter_commands: - | DISCARD TABLESPACE { Lex->alter_info.tablespace_op= DISCARD_TABLESPACE; } - | IMPORT TABLESPACE { Lex->alter_info.tablespace_op= IMPORT_TABLESPACE; } + /* empty */ + | DISCARD TABLESPACE { Lex->alter_info.tablespace_op= DISCARD_TABLESPACE; } + | IMPORT TABLESPACE { Lex->alter_info.tablespace_op= IMPORT_TABLESPACE; } | alter_list opt_partitioning | alter_list @@ -5337,20 +5584,20 @@ alter_commands: | add_partition_rule | DROP PARTITION_SYM alt_part_name_list { - Lex->alter_info.flags|= ALTER_DROP_PARTITION; + Lex->alter_info.flags|= ALTER_DROP_PARTITION; } | REBUILD_SYM PARTITION_SYM opt_no_write_to_binlog all_or_alt_part_name_list { LEX *lex= Lex; - lex->alter_info.flags|= ALTER_REBUILD_PARTITION; + lex->alter_info.flags|= ALTER_REBUILD_PARTITION; lex->no_write_to_binlog= $3; } | OPTIMIZE PARTITION_SYM opt_no_write_to_binlog all_or_alt_part_name_list { LEX *lex= Lex; - lex->alter_info.flags|= ALTER_OPTIMIZE_PARTITION; + lex->alter_info.flags|= ALTER_OPTIMIZE_PARTITION; lex->no_write_to_binlog= $3; lex->check_opt.init(); } @@ -5359,7 +5606,7 @@ alter_commands: all_or_alt_part_name_list { LEX *lex= Lex; - lex->alter_info.flags|= ALTER_ANALYZE_PARTITION; + lex->alter_info.flags|= ALTER_ANALYZE_PARTITION; lex->no_write_to_binlog= $3; lex->check_opt.init(); } @@ -5367,7 +5614,7 @@ alter_commands: | CHECK_SYM PARTITION_SYM all_or_alt_part_name_list { LEX *lex= Lex; - lex->alter_info.flags|= ALTER_CHECK_PARTITION; + lex->alter_info.flags|= ALTER_CHECK_PARTITION; lex->check_opt.init(); } opt_mi_check_type @@ -5375,7 +5622,7 @@ alter_commands: all_or_alt_part_name_list { LEX *lex= Lex; - lex->alter_info.flags|= ALTER_REPAIR_PARTITION; + lex->alter_info.flags|= ALTER_REPAIR_PARTITION; lex->no_write_to_binlog= $3; lex->check_opt.init(); } @@ -5383,104 +5630,104 @@ alter_commands: | COALESCE PARTITION_SYM opt_no_write_to_binlog real_ulong_num { LEX *lex= Lex; - lex->alter_info.flags|= ALTER_COALESCE_PARTITION; + lex->alter_info.flags|= ALTER_COALESCE_PARTITION; lex->no_write_to_binlog= $3; - lex->alter_info.no_parts= $4; + lex->alter_info.no_parts= $4; } | reorg_partition_rule ; remove_partitioning: - REMOVE_SYM PARTITIONING_SYM - { - Lex->alter_info.flags|= ALTER_REMOVE_PARTITIONING; - } + REMOVE_SYM PARTITIONING_SYM + { + Lex->alter_info.flags|= ALTER_REMOVE_PARTITIONING; + } ; all_or_alt_part_name_list: - ALL - { - Lex->alter_info.flags|= ALTER_ALL_PARTITION; - } + ALL + { + Lex->alter_info.flags|= ALTER_ALL_PARTITION; + } | alt_part_name_list ; add_partition_rule: - ADD PARTITION_SYM opt_no_write_to_binlog - { - LEX *lex= Lex; - lex->part_info= new partition_info(); - if (!lex->part_info) + ADD PARTITION_SYM opt_no_write_to_binlog { - mem_alloc_error(sizeof(partition_info)); - MYSQL_YYABORT; + LEX *lex= Lex; + lex->part_info= new partition_info(); + if (!lex->part_info) + { + mem_alloc_error(sizeof(partition_info)); + MYSQL_YYABORT; + } + lex->alter_info.flags|= ALTER_ADD_PARTITION; + lex->no_write_to_binlog= $3; } - lex->alter_info.flags|= ALTER_ADD_PARTITION; - lex->no_write_to_binlog= $3; - } - add_part_extra - {} + add_part_extra + {} ; add_part_extra: + /* empty */ | '(' part_def_list ')' - { - LEX *lex= Lex; - lex->part_info->no_parts= lex->part_info->partitions.elements; - } + { + LEX *lex= Lex; + lex->part_info->no_parts= lex->part_info->partitions.elements; + } | PARTITIONS_SYM real_ulong_num - { - LEX *lex= Lex; - lex->part_info->no_parts= $2; - } + { + LEX *lex= Lex; + lex->part_info->no_parts= $2; + } ; reorg_partition_rule: - REORGANIZE_SYM PARTITION_SYM opt_no_write_to_binlog - { - LEX *lex= Lex; - lex->part_info= new partition_info(); - if (!lex->part_info) + REORGANIZE_SYM PARTITION_SYM opt_no_write_to_binlog { + LEX *lex= Lex; + lex->part_info= new partition_info(); + if (!lex->part_info) + { mem_alloc_error(sizeof(partition_info)); - MYSQL_YYABORT; + MYSQL_YYABORT; + } + lex->no_write_to_binlog= $3; } - lex->no_write_to_binlog= $3; - } - reorg_parts_rule + reorg_parts_rule ; reorg_parts_rule: - /* empty */ - { - Lex->alter_info.flags|= ALTER_TABLE_REORG; - } - | - alt_part_name_list - { - Lex->alter_info.flags|= ALTER_REORGANIZE_PARTITION; - } - INTO '(' part_def_list ')' - { - LEX *lex= Lex; - lex->part_info->no_parts= lex->part_info->partitions.elements; - } + /* empty */ + { + Lex->alter_info.flags|= ALTER_TABLE_REORG; + } + | alt_part_name_list + { + Lex->alter_info.flags|= ALTER_REORGANIZE_PARTITION; + } + INTO '(' part_def_list ')' + { + LEX *lex= Lex; + lex->part_info->no_parts= lex->part_info->partitions.elements; + } ; alt_part_name_list: - alt_part_name_item {} + alt_part_name_item {} | alt_part_name_list ',' alt_part_name_item {} ; alt_part_name_item: - ident - { - if (Lex->alter_info.partition_names.push_back($1.str)) + ident { - mem_alloc_error(1); - MYSQL_YYABORT; + if (Lex->alter_info.partition_names.push_back($1.str)) + { + mem_alloc_error(1); + MYSQL_YYABORT; + } } - } ; /* @@ -5488,34 +5735,35 @@ alt_part_name_item: */ alter_list: - alter_list_item - | alter_list ',' alter_list_item + alter_list_item + | alter_list ',' alter_list_item ; add_column: - ADD opt_column - { - LEX *lex=Lex; - lex->change=0; - lex->alter_info.flags|= ALTER_ADD_COLUMN; - }; + ADD opt_column + { + LEX *lex=Lex; + lex->change=0; + lex->alter_info.flags|= ALTER_ADD_COLUMN; + } + ; alter_list_item: - add_column column_def opt_place { } - | ADD key_def - { - Lex->alter_info.flags|= ALTER_ADD_INDEX; - } - | add_column '(' field_list ')' + add_column column_def opt_place { } + | ADD key_def { - Lex->alter_info.flags|= ALTER_ADD_COLUMN | ALTER_ADD_INDEX; + Lex->alter_info.flags|= ALTER_ADD_INDEX; + } + | add_column '(' field_list ')' + { + Lex->alter_info.flags|= ALTER_ADD_COLUMN | ALTER_ADD_INDEX; + } + | CHANGE opt_column field_ident + { + LEX *lex=Lex; + lex->change= $3.str; + lex->alter_info.flags|= ALTER_CHANGE_COLUMN; } - | CHANGE opt_column field_ident - { - LEX *lex=Lex; - lex->change= $3.str; - lex->alter_info.flags|= ALTER_CHANGE_COLUMN; - } field_spec opt_place | MODIFY_SYM opt_column field_ident { @@ -5523,8 +5771,8 @@ alter_list_item: lex->length=lex->dec=0; lex->type=0; lex->default_value= lex->on_update_value= 0; lex->comment=null_lex_str; - lex->charset= NULL; - lex->alter_info.flags|= ALTER_CHANGE_COLUMN; + lex->charset= NULL; + lex->alter_info.flags|= ALTER_CHANGE_COLUMN; } type opt_attribute { @@ -5534,66 +5782,66 @@ alter_list_item: lex->length,lex->dec,lex->type, lex->default_value, lex->on_update_value, &lex->comment, - $3.str, &lex->interval_list, lex->charset, - lex->uint_geom_type)) - MYSQL_YYABORT; + $3.str, &lex->interval_list, lex->charset, + lex->uint_geom_type)) + MYSQL_YYABORT; } opt_place - | DROP opt_column field_ident opt_restrict - { - LEX *lex=Lex; - lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::COLUMN, + | DROP opt_column field_ident opt_restrict + { + LEX *lex=Lex; + lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::COLUMN, $3.str)); - lex->alter_info.flags|= ALTER_DROP_COLUMN; - } - | DROP FOREIGN KEY_SYM opt_ident - { - Lex->alter_info.flags|= ALTER_DROP_INDEX | ALTER_FOREIGN_KEY; + lex->alter_info.flags|= ALTER_DROP_COLUMN; } - | DROP PRIMARY_SYM KEY_SYM - { - LEX *lex=Lex; - lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::KEY, - primary_key_name)); - lex->alter_info.flags|= ALTER_DROP_INDEX; - } - | DROP key_or_index field_ident - { - LEX *lex=Lex; - lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::KEY, - $3.str)); - lex->alter_info.flags|= ALTER_DROP_INDEX; - } - | DISABLE_SYM KEYS + | DROP FOREIGN KEY_SYM opt_ident { - LEX *lex=Lex; + Lex->alter_info.flags|= ALTER_DROP_INDEX | ALTER_FOREIGN_KEY; + } + | DROP PRIMARY_SYM KEY_SYM + { + LEX *lex=Lex; + lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::KEY, + primary_key_name)); + lex->alter_info.flags|= ALTER_DROP_INDEX; + } + | DROP key_or_index field_ident + { + LEX *lex=Lex; + lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::KEY, + $3.str)); + lex->alter_info.flags|= ALTER_DROP_INDEX; + } + | DISABLE_SYM KEYS + { + LEX *lex=Lex; lex->alter_info.keys_onoff= DISABLE; - lex->alter_info.flags|= ALTER_KEYS_ONOFF; + lex->alter_info.flags|= ALTER_KEYS_ONOFF; } - | ENABLE_SYM KEYS + | ENABLE_SYM KEYS { - LEX *lex=Lex; + LEX *lex=Lex; lex->alter_info.keys_onoff= ENABLE; - lex->alter_info.flags|= ALTER_KEYS_ONOFF; + lex->alter_info.flags|= ALTER_KEYS_ONOFF; } - | ALTER opt_column field_ident SET DEFAULT signed_literal - { - LEX *lex=Lex; - lex->alter_info.alter_list.push_back(new Alter_column($3.str,$6)); - lex->alter_info.flags|= ALTER_CHANGE_COLUMN_DEFAULT; - } - | ALTER opt_column field_ident DROP DEFAULT - { - LEX *lex=Lex; - lex->alter_info.alter_list.push_back(new Alter_column($3.str, + | ALTER opt_column field_ident SET DEFAULT signed_literal + { + LEX *lex=Lex; + lex->alter_info.alter_list.push_back(new Alter_column($3.str,$6)); + lex->alter_info.flags|= ALTER_CHANGE_COLUMN_DEFAULT; + } + | ALTER opt_column field_ident DROP DEFAULT + { + LEX *lex=Lex; + lex->alter_info.alter_list.push_back(new Alter_column($3.str, (Item*) 0)); - lex->alter_info.flags|= ALTER_CHANGE_COLUMN_DEFAULT; - } - | RENAME opt_to table_ident - { - LEX *lex=Lex; - size_t dummy; - lex->select_lex.db=$3->db.str; + lex->alter_info.flags|= ALTER_CHANGE_COLUMN_DEFAULT; + } + | RENAME opt_to table_ident + { + LEX *lex=Lex; + size_t dummy; + lex->select_lex.db=$3->db.str; if (lex->select_lex.db == NULL && lex->copy_db_to(&lex->select_lex.db, &dummy)) { @@ -5605,150 +5853,153 @@ alter_list_item: my_error(ER_WRONG_TABLE_NAME, MYF(0), $3->table.str); MYSQL_YYABORT; } - lex->name= $3->table; - lex->alter_info.flags|= ALTER_RENAME; - } - | CONVERT_SYM TO_SYM charset charset_name_or_default opt_collate - { - if (!$4) - { - THD *thd= YYTHD; - $4= thd->variables.collation_database; - } - $5= $5 ? $5 : $4; - if (!my_charset_same($4,$5)) - { - my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0), + lex->name= $3->table; + lex->alter_info.flags|= ALTER_RENAME; + } + | CONVERT_SYM TO_SYM charset charset_name_or_default opt_collate + { + if (!$4) + { + THD *thd= YYTHD; + $4= thd->variables.collation_database; + } + $5= $5 ? $5 : $4; + if (!my_charset_same($4,$5)) + { + my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0), $5->name, $4->csname); - MYSQL_YYABORT; - } - LEX *lex= Lex; - lex->create_info.table_charset= - lex->create_info.default_table_charset= $5; - lex->create_info.used_fields|= (HA_CREATE_USED_CHARSET | - HA_CREATE_USED_DEFAULT_CHARSET); - lex->alter_info.flags|= ALTER_CONVERT; - } + MYSQL_YYABORT; + } + LEX *lex= Lex; + lex->create_info.table_charset= + lex->create_info.default_table_charset= $5; + lex->create_info.used_fields|= (HA_CREATE_USED_CHARSET | + HA_CREATE_USED_DEFAULT_CHARSET); + lex->alter_info.flags|= ALTER_CONVERT; + } | create_table_options_space_separated - { - LEX *lex=Lex; - lex->alter_info.flags|= ALTER_OPTIONS; - } - | FORCE_SYM - { - Lex->alter_info.flags|= ALTER_FORCE; - } - | alter_order_clause - { - LEX *lex=Lex; - lex->alter_info.flags|= ALTER_ORDER; - }; + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_OPTIONS; + } + | FORCE_SYM + { + Lex->alter_info.flags|= ALTER_FORCE; + } + | alter_order_clause + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_ORDER; + } + ; opt_column: - /* empty */ {} - | COLUMN_SYM {}; + /* empty */ {} + | COLUMN_SYM {} + ; opt_ignore: - /* empty */ { Lex->ignore= 0;} - | IGNORE_SYM { Lex->ignore= 1;} - ; + /* empty */ { Lex->ignore= 0;} + | IGNORE_SYM { Lex->ignore= 1;} + ; opt_restrict: - /* empty */ { Lex->drop_mode= DROP_DEFAULT; } - | RESTRICT { Lex->drop_mode= DROP_RESTRICT; } - | CASCADE { Lex->drop_mode= DROP_CASCADE; } - ; + /* empty */ { Lex->drop_mode= DROP_DEFAULT; } + | RESTRICT { Lex->drop_mode= DROP_RESTRICT; } + | CASCADE { Lex->drop_mode= DROP_CASCADE; } + ; opt_place: - /* empty */ {} - | AFTER_SYM ident { store_position_for_column($2.str); } - | FIRST_SYM { store_position_for_column(first_keyword); }; + /* empty */ {} + | AFTER_SYM ident { store_position_for_column($2.str); } + | FIRST_SYM { store_position_for_column(first_keyword); } + ; opt_to: - /* empty */ {} - | TO_SYM {} - | EQ {} - | AS {}; + /* empty */ {} + | TO_SYM {} + | EQ {} + | AS {} + ; /* SLAVE START and SLAVE STOP are deprecated. We keep them for compatibility. */ slave: - START_SYM SLAVE slave_thread_opts + START_SYM SLAVE slave_thread_opts { - LEX *lex=Lex; + LEX *lex=Lex; lex->sql_command = SQLCOM_SLAVE_START; - lex->type = 0; - /* We'll use mi structure for UNTIL options */ - bzero((char*) &lex->mi, sizeof(lex->mi)); + lex->type = 0; + /* We'll use mi structure for UNTIL options */ + bzero((char*) &lex->mi, sizeof(lex->mi)); /* If you change this code don't forget to update SLAVE START too */ } slave_until {} | STOP_SYM SLAVE slave_thread_opts { - LEX *lex=Lex; + LEX *lex=Lex; lex->sql_command = SQLCOM_SLAVE_STOP; - lex->type = 0; + lex->type = 0; /* If you change this code don't forget to update SLAVE STOP too */ } - | SLAVE START_SYM slave_thread_opts - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_SLAVE_START; - lex->type = 0; - /* We'll use mi structure for UNTIL options */ - bzero((char*) &lex->mi, sizeof(lex->mi)); + | SLAVE START_SYM slave_thread_opts + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_START; + lex->type = 0; + /* We'll use mi structure for UNTIL options */ + bzero((char*) &lex->mi, sizeof(lex->mi)); } slave_until {} - | SLAVE STOP_SYM slave_thread_opts - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_SLAVE_STOP; - lex->type = 0; - } + | SLAVE STOP_SYM slave_thread_opts + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_STOP; + lex->type = 0; + } ; - start: - START_SYM TRANSACTION_SYM start_transaction_opts - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_BEGIN; - lex->start_transaction_opt= $3; - } - ; + START_SYM TRANSACTION_SYM start_transaction_opts + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_BEGIN; + lex->start_transaction_opt= $3; + } + ; start_transaction_opts: - /*empty*/ { $$ = 0; } + /*empty*/ { $$ = 0; } | WITH CONSISTENT_SYM SNAPSHOT_SYM - { - $$= MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT; - } + { + $$= MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT; + } ; slave_thread_opts: - { Lex->slave_thd_opt= 0; } - slave_thread_opt_list - {} - ; + { Lex->slave_thd_opt= 0; } + slave_thread_opt_list + {} + ; slave_thread_opt_list: - slave_thread_opt - | slave_thread_opt_list ',' slave_thread_opt - ; + slave_thread_opt + | slave_thread_opt_list ',' slave_thread_opt + ; slave_thread_opt: - /*empty*/ {} - | SQL_THREAD { Lex->slave_thd_opt|=SLAVE_SQL; } - | RELAY_THREAD { Lex->slave_thd_opt|=SLAVE_IO; } - ; + /*empty*/ {} + | SQL_THREAD { Lex->slave_thd_opt|=SLAVE_SQL; } + | RELAY_THREAD { Lex->slave_thd_opt|=SLAVE_IO; } + ; slave_until: - /*empty*/ {} - | UNTIL_SYM slave_until_opts + /*empty*/ {} + | UNTIL_SYM slave_until_opts { LEX *lex=Lex; if ((lex->mi.log_file_name || lex->mi.pos) && @@ -5760,173 +6011,180 @@ slave_until: ER(ER_BAD_SLAVE_UNTIL_COND), MYF(0)); MYSQL_YYABORT; } - } - ; + ; slave_until_opts: - master_file_def - | slave_until_opts ',' master_file_def ; - + master_file_def + | slave_until_opts ',' master_file_def + ; restore: - RESTORE_SYM table_or_tables - { - Lex->sql_command = SQLCOM_RESTORE_TABLE; - } - table_list FROM TEXT_STRING_sys - { - Lex->backup_dir = $6.str; - }; + RESTORE_SYM table_or_tables + { + Lex->sql_command = SQLCOM_RESTORE_TABLE; + } + table_list FROM TEXT_STRING_sys + { + Lex->backup_dir = $6.str; + } + ; backup: - BACKUP_SYM table_or_tables - { - Lex->sql_command = SQLCOM_BACKUP_TABLE; - } - table_list TO_SYM TEXT_STRING_sys - { - Lex->backup_dir = $6.str; - }; + BACKUP_SYM table_or_tables + { + Lex->sql_command = SQLCOM_BACKUP_TABLE; + } + table_list TO_SYM TEXT_STRING_sys + { + Lex->backup_dir = $6.str; + } + ; checksum: - CHECKSUM_SYM table_or_tables - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_CHECKSUM; - } - table_list opt_checksum_type - {} - ; + CHECKSUM_SYM table_or_tables + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_CHECKSUM; + } + table_list opt_checksum_type + {} + ; opt_checksum_type: - /* nothing */ { Lex->check_opt.flags= 0; } - | QUICK { Lex->check_opt.flags= T_QUICK; } - | EXTENDED_SYM { Lex->check_opt.flags= T_EXTEND; } + /* nothing */ { Lex->check_opt.flags= 0; } + | QUICK { Lex->check_opt.flags= T_QUICK; } + | EXTENDED_SYM { Lex->check_opt.flags= T_EXTEND; } ; repair: - REPAIR opt_no_write_to_binlog table_or_tables - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_REPAIR; - lex->no_write_to_binlog= $2; - lex->check_opt.init(); - } - table_list opt_mi_repair_type - {} - ; + REPAIR opt_no_write_to_binlog table_or_tables + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_REPAIR; + lex->no_write_to_binlog= $2; + lex->check_opt.init(); + } + table_list opt_mi_repair_type + {} + ; opt_mi_repair_type: - /* empty */ { Lex->check_opt.flags = T_MEDIUM; } - | mi_repair_types {}; + /* empty */ { Lex->check_opt.flags = T_MEDIUM; } + | mi_repair_types {} + ; mi_repair_types: - mi_repair_type {} - | mi_repair_type mi_repair_types {}; + mi_repair_type {} + | mi_repair_type mi_repair_types {} + ; mi_repair_type: - QUICK { Lex->check_opt.flags|= T_QUICK; } - | EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; } - | USE_FRM { Lex->check_opt.sql_flags|= TT_USEFRM; }; + QUICK { Lex->check_opt.flags|= T_QUICK; } + | EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; } + | USE_FRM { Lex->check_opt.sql_flags|= TT_USEFRM; } + ; analyze: - ANALYZE_SYM opt_no_write_to_binlog table_or_tables - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_ANALYZE; - lex->no_write_to_binlog= $2; - lex->check_opt.init(); - } - table_list opt_mi_check_type - {} - ; + ANALYZE_SYM opt_no_write_to_binlog table_or_tables + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_ANALYZE; + lex->no_write_to_binlog= $2; + lex->check_opt.init(); + } + table_list opt_mi_check_type + {} + ; binlog_base64_event: - BINLOG_SYM TEXT_STRING_sys - { - Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; - Lex->comment= $2; - } + BINLOG_SYM TEXT_STRING_sys + { + Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; + Lex->comment= $2; + } ; check: - CHECK_SYM table_or_tables - { - LEX *lex=Lex; + CHECK_SYM table_or_tables + { + LEX *lex=Lex; - if (lex->sphead) - { - my_error(ER_SP_BADSTATEMENT, MYF(0), "CHECK"); - MYSQL_YYABORT; - } - lex->sql_command = SQLCOM_CHECK; - lex->check_opt.init(); - } - table_list opt_mi_check_type - {} - ; + if (lex->sphead) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), "CHECK"); + MYSQL_YYABORT; + } + lex->sql_command = SQLCOM_CHECK; + lex->check_opt.init(); + } + table_list opt_mi_check_type + {} + ; opt_mi_check_type: - /* empty */ { Lex->check_opt.flags = T_MEDIUM; } - | mi_check_types {}; + /* empty */ { Lex->check_opt.flags = T_MEDIUM; } + | mi_check_types {} + ; mi_check_types: - mi_check_type {} - | mi_check_type mi_check_types {}; + mi_check_type {} + | mi_check_type mi_check_types {} + ; mi_check_type: - QUICK { Lex->check_opt.flags|= T_QUICK; } - | FAST_SYM { Lex->check_opt.flags|= T_FAST; } - | MEDIUM_SYM { Lex->check_opt.flags|= T_MEDIUM; } - | EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; } - | CHANGED { Lex->check_opt.flags|= T_CHECK_ONLY_CHANGED; } - | FOR_SYM UPGRADE_SYM { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; }; + QUICK { Lex->check_opt.flags|= T_QUICK; } + | FAST_SYM { Lex->check_opt.flags|= T_FAST; } + | MEDIUM_SYM { Lex->check_opt.flags|= T_MEDIUM; } + | EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; } + | CHANGED { Lex->check_opt.flags|= T_CHECK_ONLY_CHANGED; } + | FOR_SYM UPGRADE_SYM { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } + ; optimize: - OPTIMIZE opt_no_write_to_binlog table_or_tables - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_OPTIMIZE; - lex->no_write_to_binlog= $2; - lex->check_opt.init(); - } - table_list opt_mi_check_type - {} - ; + OPTIMIZE opt_no_write_to_binlog table_or_tables + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_OPTIMIZE; + lex->no_write_to_binlog= $2; + lex->check_opt.init(); + } + table_list opt_mi_check_type + {} + ; opt_no_write_to_binlog: - /* empty */ { $$= 0; } - | NO_WRITE_TO_BINLOG { $$= 1; } - | LOCAL_SYM { $$= 1; } - ; + /* empty */ { $$= 0; } + | NO_WRITE_TO_BINLOG { $$= 1; } + | LOCAL_SYM { $$= 1; } + ; rename: - RENAME table_or_tables - { - Lex->sql_command= SQLCOM_RENAME_TABLE; - } - table_to_table_list - {} - | RENAME DATABASE + RENAME table_or_tables + { + Lex->sql_command= SQLCOM_RENAME_TABLE; + } + table_to_table_list + {} + | RENAME DATABASE { Lex->db_list.empty(); Lex->sql_command= SQLCOM_RENAME_DB; } db_to_db {} - | RENAME USER clear_privileges rename_list + | RENAME USER clear_privileges rename_list { - Lex->sql_command = SQLCOM_RENAME_USER; + Lex->sql_command = SQLCOM_RENAME_USER; } - ; + ; rename_list: - user TO_SYM user - { - if (Lex->users_list.push_back($1) || Lex->users_list.push_back($3)) - MYSQL_YYABORT; - } + user TO_SYM user + { + if (Lex->users_list.push_back($1) || Lex->users_list.push_back($3)) + MYSQL_YYABORT; + } | rename_list ',' user TO_SYM user { if (Lex->users_list.push_back($3) || Lex->users_list.push_back($5)) @@ -5935,103 +6193,108 @@ rename_list: ; table_to_table_list: - table_to_table - | table_to_table_list ',' table_to_table; + table_to_table + | table_to_table_list ',' table_to_table + ; table_to_table: - table_ident TO_SYM table_ident - { - LEX *lex=Lex; - SELECT_LEX *sl= lex->current_select; - if (!sl->add_table_to_list(lex->thd, $1,NULL,TL_OPTION_UPDATING, - TL_IGNORE) || - !sl->add_table_to_list(lex->thd, $3,NULL,TL_OPTION_UPDATING, - TL_IGNORE)) - MYSQL_YYABORT; - }; + table_ident TO_SYM table_ident + { + LEX *lex=Lex; + SELECT_LEX *sl= lex->current_select; + if (!sl->add_table_to_list(lex->thd, $1,NULL,TL_OPTION_UPDATING, + TL_IGNORE) || + !sl->add_table_to_list(lex->thd, $3,NULL,TL_OPTION_UPDATING, + TL_IGNORE)) + MYSQL_YYABORT; + } + ; db_to_db: - ident TO_SYM ident - { - LEX *lex=Lex; - if (lex->db_list.push_back((LEX_STRING*) - sql_memdup(&$1, sizeof(LEX_STRING))) || - lex->db_list.push_back((LEX_STRING*) - sql_memdup(&$3, sizeof(LEX_STRING)))) + ident TO_SYM ident + { + LEX *lex=Lex; + if (lex->db_list.push_back((LEX_STRING*) + sql_memdup(&$1, sizeof(LEX_STRING))) || + lex->db_list.push_back((LEX_STRING*) + sql_memdup(&$3, sizeof(LEX_STRING)))) MYSQL_YYABORT; - }; + } + ; keycache: - CACHE_SYM INDEX_SYM keycache_list IN_SYM key_cache_name - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_ASSIGN_TO_KEYCACHE; - lex->ident= $5; - } + CACHE_SYM INDEX_SYM keycache_list IN_SYM key_cache_name + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ASSIGN_TO_KEYCACHE; + lex->ident= $5; + } ; keycache_list: - assign_to_keycache - | keycache_list ',' assign_to_keycache; + assign_to_keycache + | keycache_list ',' assign_to_keycache + ; assign_to_keycache: - table_ident cache_keys_spec - { - if (!Select->add_table_to_list(YYTHD, $1, NULL, 0, TL_READ, - Select->pop_index_hints())) - MYSQL_YYABORT; - } + table_ident cache_keys_spec + { + if (!Select->add_table_to_list(YYTHD, $1, NULL, 0, TL_READ, + Select->pop_index_hints())) + MYSQL_YYABORT; + } ; key_cache_name: - ident { $$= $1; } - | DEFAULT { $$ = default_key_cache_base; } - ; + ident { $$= $1; } + | DEFAULT { $$ = default_key_cache_base; } + ; preload: - LOAD INDEX_SYM INTO CACHE_SYM - { - LEX *lex=Lex; - lex->sql_command=SQLCOM_PRELOAD_KEYS; - } - preload_list - {} - ; + LOAD INDEX_SYM INTO CACHE_SYM + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_PRELOAD_KEYS; + } + preload_list + {} + ; preload_list: - preload_keys - | preload_list ',' preload_keys; + preload_keys + | preload_list ',' preload_keys + ; preload_keys: - table_ident cache_keys_spec opt_ignore_leaves - { - if (!Select->add_table_to_list(YYTHD, $1, NULL, $3, TL_READ, - Select->pop_index_hints())) - MYSQL_YYABORT; - } - ; + table_ident cache_keys_spec opt_ignore_leaves + { + if (!Select->add_table_to_list(YYTHD, $1, NULL, $3, TL_READ, + Select->pop_index_hints())) + MYSQL_YYABORT; + } + ; cache_keys_spec: - { - Lex->select_lex.alloc_index_hints(YYTHD); - Select->set_index_hint_type(INDEX_HINT_USE, - global_system_variables.old_mode ? + { + Lex->select_lex.alloc_index_hints(YYTHD); + Select->set_index_hint_type(INDEX_HINT_USE, + global_system_variables.old_mode ? INDEX_HINT_MASK_JOIN : INDEX_HINT_MASK_ALL); - } - cache_key_list_or_empty + } + cache_key_list_or_empty ; cache_key_list_or_empty: - /* empty */ { } - | key_or_index '(' opt_key_usage_list ')' - ; + /* empty */ { } + | key_or_index '(' opt_key_usage_list ')' + ; opt_ignore_leaves: - /* empty */ - { $$= 0; } - | IGNORE_SYM LEAVES { $$= TL_OPTION_IGNORE_LEAVES; } - ; + /* empty */ + { $$= 0; } + | IGNORE_SYM LEAVES { $$= TL_OPTION_IGNORE_LEAVES; } + ; /* Select : retrieve data from table @@ -6039,29 +6302,29 @@ opt_ignore_leaves: select: - select_init - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SELECT; - } - ; + select_init + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SELECT; + } + ; /* Need select_init2 for subselects. */ select_init: - SELECT_SYM select_init2 - | - '(' select_paren ')' union_opt; + SELECT_SYM select_init2 + | '(' select_paren ')' union_opt + ; select_paren: - SELECT_SYM select_part2 - { - LEX *lex= Lex; + SELECT_SYM select_part2 + { + LEX *lex= Lex; SELECT_LEX * sel= lex->current_select; - if (sel->set_braces(1)) - { + if (sel->set_braces(1)) + { my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } + MYSQL_YYABORT; + } if (sel->linkage == UNION_TYPE && !sel->master_unit()->first_select()->braces && sel->master_unit()->first_select()->linkage == @@ -6071,56 +6334,59 @@ select_paren: MYSQL_YYABORT; } /* select in braces, can't contain global parameters */ - if (sel->master_unit()->fake_select_lex) + if (sel->master_unit()->fake_select_lex) sel->master_unit()->global_parameters= sel->master_unit()->fake_select_lex; } - | '(' select_paren ')'; + | '(' select_paren ')' + ; select_init2: - select_part2 - { - LEX *lex= Lex; - SELECT_LEX * sel= lex->current_select; - if (lex->current_select->set_braces(0)) - { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } - if (sel->linkage == UNION_TYPE && - sel->master_unit()->first_select()->braces) - { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } - } - union_clause - ; + select_part2 + { + LEX *lex= Lex; + SELECT_LEX * sel= lex->current_select; + if (lex->current_select->set_braces(0)) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + if (sel->linkage == UNION_TYPE && + sel->master_unit()->first_select()->braces) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + } + union_clause + ; select_part2: - { - LEX *lex= Lex; - SELECT_LEX *sel= lex->current_select; - if (sel->linkage != UNION_TYPE) - mysql_init_select(lex); - lex->current_select->parsing_place= SELECT_LIST; - } - select_options select_item_list - { - Select->parsing_place= NO_MATTER; - } - select_into select_lock_type; + { + LEX *lex= Lex; + SELECT_LEX *sel= lex->current_select; + if (sel->linkage != UNION_TYPE) + mysql_init_select(lex); + lex->current_select->parsing_place= SELECT_LIST; + } + select_options select_item_list + { + Select->parsing_place= NO_MATTER; + } + select_into select_lock_type + ; select_into: - opt_order_clause opt_limit_clause {} + opt_order_clause opt_limit_clause {} | into - | select_from - | into select_from - | select_from into; + | select_from + | into select_from + | select_from into + ; select_from: - FROM join_table_list where_clause group_clause having_clause - opt_order_clause opt_limit_clause procedure_clause + FROM join_table_list where_clause group_clause having_clause + opt_order_clause opt_limit_clause procedure_clause { Select->context.table_list= Select->context.first_name_resolution_table= @@ -6131,55 +6397,56 @@ select_from: and DUAL is system table without fields. Is "SELECT 1 FROM DUAL" any better than "SELECT 1" ? Hmmm :) */ - ; + ; select_options: - /* empty*/ - | select_option_list - { - if (Select->options & SELECT_DISTINCT && Select->options & SELECT_ALL) - { - my_error(ER_WRONG_USAGE, MYF(0), "ALL", "DISTINCT"); + /* empty*/ + | select_option_list + { + if (Select->options & SELECT_DISTINCT && Select->options & SELECT_ALL) + { + my_error(ER_WRONG_USAGE, MYF(0), "ALL", "DISTINCT"); MYSQL_YYABORT; - } + } } - ; + ; select_option_list: - select_option_list select_option - | select_option; + select_option_list select_option + | select_option + ; select_option: - STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; } - | HIGH_PRIORITY - { - if (check_simple_select()) - MYSQL_YYABORT; - Lex->lock_option= TL_READ_HIGH_PRIORITY; - } - | DISTINCT { Select->options|= SELECT_DISTINCT; } - | SQL_SMALL_RESULT { Select->options|= SELECT_SMALL_RESULT; } - | SQL_BIG_RESULT { Select->options|= SELECT_BIG_RESULT; } - | SQL_BUFFER_RESULT - { - if (check_simple_select()) - MYSQL_YYABORT; - Select->options|= OPTION_BUFFER_RESULT; - } - | SQL_CALC_FOUND_ROWS - { - if (check_simple_select()) - MYSQL_YYABORT; - Select->options|= OPTION_FOUND_ROWS; - } - | SQL_NO_CACHE_SYM + STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; } + | HIGH_PRIORITY + { + if (check_simple_select()) + MYSQL_YYABORT; + Lex->lock_option= TL_READ_HIGH_PRIORITY; + } + | DISTINCT { Select->options|= SELECT_DISTINCT; } + | SQL_SMALL_RESULT { Select->options|= SELECT_SMALL_RESULT; } + | SQL_BIG_RESULT { Select->options|= SELECT_BIG_RESULT; } + | SQL_BUFFER_RESULT + { + if (check_simple_select()) + MYSQL_YYABORT; + Select->options|= OPTION_BUFFER_RESULT; + } + | SQL_CALC_FOUND_ROWS + { + if (check_simple_select()) + MYSQL_YYABORT; + Select->options|= OPTION_FOUND_ROWS; + } + | SQL_NO_CACHE_SYM { Lex->safe_to_cache_query=0; - Lex->select_lex.options&= ~OPTION_TO_QUERY_CACHE; + Lex->select_lex.options&= ~OPTION_TO_QUERY_CACHE; Lex->select_lex.sql_cache= SELECT_LEX::SQL_NO_CACHE; } - | SQL_CACHE_SYM - { + | SQL_CACHE_SYM + { /* Honor this flag only if SQL_NO_CACHE wasn't specified AND we are parsing the outermost SELECT in the query. @@ -6188,94 +6455,98 @@ select_option: Lex->current_select == &Lex->select_lex) { Lex->safe_to_cache_query=1; - Lex->select_lex.options|= OPTION_TO_QUERY_CACHE; + Lex->select_lex.options|= OPTION_TO_QUERY_CACHE; Lex->select_lex.sql_cache= SELECT_LEX::SQL_CACHE; } - } - | ALL { Select->options|= SELECT_ALL; } - ; + } + | ALL { Select->options|= SELECT_ALL; } + ; select_lock_type: - /* empty */ - | FOR_SYM UPDATE_SYM - { - LEX *lex=Lex; - lex->current_select->set_lock_for_tables(TL_WRITE); - lex->safe_to_cache_query=0; - } - | LOCK_SYM IN_SYM SHARE_SYM MODE_SYM - { - LEX *lex=Lex; - lex->current_select-> - set_lock_for_tables(TL_READ_WITH_SHARED_LOCKS); - lex->safe_to_cache_query=0; - } - ; + /* empty */ + | FOR_SYM UPDATE_SYM + { + LEX *lex=Lex; + lex->current_select->set_lock_for_tables(TL_WRITE); + lex->safe_to_cache_query=0; + } + | LOCK_SYM IN_SYM SHARE_SYM MODE_SYM + { + LEX *lex=Lex; + lex->current_select-> + set_lock_for_tables(TL_READ_WITH_SHARED_LOCKS); + lex->safe_to_cache_query=0; + } + ; select_item_list: - select_item_list ',' select_item - | select_item - | '*' - { - THD *thd= YYTHD; - if (add_item_to_list(thd, + select_item_list ',' select_item + | select_item + | '*' + { + THD *thd= YYTHD; + if (add_item_to_list(thd, new Item_field(&thd->lex->current_select-> context, NULL, NULL, "*"))) - MYSQL_YYABORT; - (thd->lex->current_select->with_wild)++; - }; - + MYSQL_YYABORT; + (thd->lex->current_select->with_wild)++; + } + ; select_item: - remember_name select_item2 remember_end select_alias - { + remember_name select_item2 remember_end select_alias + { THD *thd= YYTHD; DBUG_ASSERT($1 < $3); - if (add_item_to_list(thd, $2)) - MYSQL_YYABORT; - if ($4.str) + if (add_item_to_list(thd, $2)) + MYSQL_YYABORT; + if ($4.str) { $2->is_autogenerated_name= FALSE; - $2->set_name($4.str, $4.length, system_charset_info); + $2->set_name($4.str, $4.length, system_charset_info); } - else if (!$2->name) + else if (!$2->name) { - $2->set_name($1, (uint) ($3 - $1), thd->charset()); - } - }; - + $2->set_name($1, (uint) ($3 - $1), thd->charset()); + } + } + ; remember_name: - { - THD *thd= YYTHD; - Lex_input_stream *lip= thd->m_lip; - $$= (char*) lip->get_cpp_tok_start(); - }; + { + THD *thd= YYTHD; + Lex_input_stream *lip= thd->m_lip; + $$= (char*) lip->get_cpp_tok_start(); + } + ; remember_end: - { - THD *thd= YYTHD; - Lex_input_stream *lip= thd->m_lip; - $$= (char*) lip->get_cpp_tok_end(); - }; + { + THD *thd= YYTHD; + Lex_input_stream *lip= thd->m_lip; + $$= (char*) lip->get_cpp_tok_end(); + } + ; select_item2: - table_wild { $$=$1; } /* table.* */ - | expr { $$=$1; }; + table_wild { $$=$1; /* table.* */ } + | expr { $$=$1; } + ; select_alias: - /* empty */ { $$=null_lex_str;} - | AS ident { $$=$2; } - | AS TEXT_STRING_sys { $$=$2; } - | ident { $$=$1; } - | TEXT_STRING_sys { $$=$1; } - ; + /* empty */ { $$=null_lex_str;} + | AS ident { $$=$2; } + | AS TEXT_STRING_sys { $$=$2; } + | ident { $$=$1; } + | TEXT_STRING_sys { $$=$1; } + ; optional_braces: - /* empty */ {} - | '(' ')' {}; + /* empty */ {} + | '(' ')' {} + ; /* all possible expressions */ expr: @@ -6328,8 +6599,9 @@ bool_and_expr: ; bool_factor: - NOT_SYM bool_factor { $$= negate_expression(YYTHD, $2); } - | bool_test ; + NOT_SYM bool_factor { $$= negate_expression(YYTHD, $2); } + | bool_test + ; bool_test: bool_pri IS TRUE_SYM @@ -6340,27 +6612,28 @@ bool_test: { $$= new (YYTHD->mem_root) Item_func_isfalse($1); } | bool_pri IS not FALSE_SYM { $$= new (YYTHD->mem_root) Item_func_isnotfalse($1); } - | bool_pri IS UNKNOWN_SYM { $$= new Item_func_isnull($1); } - | bool_pri IS not UNKNOWN_SYM { $$= new Item_func_isnotnull($1); } + | bool_pri IS UNKNOWN_SYM { $$= new Item_func_isnull($1); } + | bool_pri IS not UNKNOWN_SYM { $$= new Item_func_isnotnull($1); } | bool_pri ; bool_pri: - bool_pri IS NULL_SYM { $$= new Item_func_isnull($1); } - | bool_pri IS not NULL_SYM { $$= new Item_func_isnotnull($1); } - | bool_pri EQUAL_SYM predicate { $$= new Item_func_equal($1,$3); } - | bool_pri comp_op predicate %prec EQ - { $$= (*$2)(0)->create($1,$3); } - | bool_pri comp_op all_or_any '(' subselect ')' %prec EQ - { $$= all_any_subquery_creator($1, $2, $3, $5); } - | predicate ; + bool_pri IS NULL_SYM { $$= new Item_func_isnull($1); } + | bool_pri IS not NULL_SYM { $$= new Item_func_isnotnull($1); } + | bool_pri EQUAL_SYM predicate { $$= new Item_func_equal($1,$3); } + | bool_pri comp_op predicate %prec EQ + { $$= (*$2)(0)->create($1,$3); } + | bool_pri comp_op all_or_any '(' subselect ')' %prec EQ + { $$= all_any_subquery_creator($1, $2, $3, $5); } + | predicate + ; predicate: - bit_expr IN_SYM '(' subselect ')' + bit_expr IN_SYM '(' subselect ')' { $$= new (YYTHD->mem_root) Item_in_subselect($1, $4); } - | bit_expr not IN_SYM '(' subselect ')' + | bit_expr not IN_SYM '(' subselect ')' { THD *thd= YYTHD; Item *item= new (thd->mem_root) Item_in_subselect($1, $5); @@ -6370,148 +6643,174 @@ predicate: { $$= handle_sql2003_note184_exception(YYTHD, $1, true, $4); } - | bit_expr IN_SYM '(' expr ',' expr_list ')' - { - $6->push_front($4); - $6->push_front($1); + | bit_expr IN_SYM '(' expr ',' expr_list ')' + { + $6->push_front($4); + $6->push_front($1); $$= new (YYTHD->mem_root) Item_func_in(*$6); } | bit_expr not IN_SYM '(' expr ')' { $$= handle_sql2003_note184_exception(YYTHD, $1, false, $5); } - | bit_expr not IN_SYM '(' expr ',' expr_list ')' + | bit_expr not IN_SYM '(' expr ',' expr_list ')' { - $7->push_front($5); - $7->push_front($1); + $7->push_front($5); + $7->push_front($1); Item_func_in *item = new (YYTHD->mem_root) Item_func_in(*$7); - item->negate(); - $$= item; + item->negate(); + $$= item; } - | bit_expr BETWEEN_SYM bit_expr AND_SYM predicate - { $$= new Item_func_between($1,$3,$5); } - | bit_expr not BETWEEN_SYM bit_expr AND_SYM predicate - { - Item_func_between *item= new Item_func_between($1,$4,$6); - item->negate(); - $$= item; - } - | bit_expr SOUNDS_SYM LIKE bit_expr - { $$= new Item_func_eq(new Item_func_soundex($1), - new Item_func_soundex($4)); } - | bit_expr LIKE simple_expr opt_escape + | bit_expr BETWEEN_SYM bit_expr AND_SYM predicate + { $$= new Item_func_between($1,$3,$5); } + | bit_expr not BETWEEN_SYM bit_expr AND_SYM predicate + { + Item_func_between *item= new Item_func_between($1,$4,$6); + item->negate(); + $$= item; + } + | bit_expr SOUNDS_SYM LIKE bit_expr + { + $$= new Item_func_eq(new Item_func_soundex($1), + new Item_func_soundex($4)); + } + | bit_expr LIKE simple_expr opt_escape { $$= new Item_func_like($1,$3,$4,Lex->escape_used); } - | bit_expr not LIKE simple_expr opt_escape + | bit_expr not LIKE simple_expr opt_escape { $$= new Item_func_not(new Item_func_like($1,$4,$5, Lex->escape_used)); } - | bit_expr REGEXP bit_expr { $$= new Item_func_regex($1,$3); } - | bit_expr not REGEXP bit_expr + | bit_expr REGEXP bit_expr { $$= new Item_func_regex($1,$3); } + | bit_expr not REGEXP bit_expr { $$= negate_expression(YYTHD, new Item_func_regex($1,$4)); } - | bit_expr ; + | bit_expr + ; bit_expr: - bit_expr '|' bit_term { $$= new Item_func_bit_or($1,$3); } - | bit_term ; + bit_expr '|' bit_term { $$= new Item_func_bit_or($1,$3); } + | bit_term + ; bit_term: - bit_term '&' bit_factor { $$= new Item_func_bit_and($1,$3); } - | bit_factor ; + bit_term '&' bit_factor { $$= new Item_func_bit_and($1,$3); } + | bit_factor + ; bit_factor: - bit_factor SHIFT_LEFT value_expr - { $$= new Item_func_shift_left($1,$3); } - | bit_factor SHIFT_RIGHT value_expr - { $$= new Item_func_shift_right($1,$3); } - | value_expr ; + bit_factor SHIFT_LEFT value_expr + { $$= new Item_func_shift_left($1,$3); } + | bit_factor SHIFT_RIGHT value_expr + { $$= new Item_func_shift_right($1,$3); } + | value_expr + ; value_expr: - value_expr '+' term { $$= new Item_func_plus($1,$3); } - | value_expr '-' term { $$= new Item_func_minus($1,$3); } - | value_expr '+' interval_expr interval - { $$= new Item_date_add_interval($1,$3,$4,0); } - | value_expr '-' interval_expr interval - { $$= new Item_date_add_interval($1,$3,$4,1); } - | term ; + value_expr '+' term { $$= new Item_func_plus($1,$3); } + | value_expr '-' term { $$= new Item_func_minus($1,$3); } + | value_expr '+' interval_expr interval + { $$= new Item_date_add_interval($1,$3,$4,0); } + | value_expr '-' interval_expr interval + { $$= new Item_date_add_interval($1,$3,$4,1); } + | term + ; term: - term '*' factor { $$= new Item_func_mul($1,$3); } - | term '/' factor { $$= new Item_func_div($1,$3); } - | term '%' factor { $$= new Item_func_mod($1,$3); } - | term DIV_SYM factor { $$= new Item_func_int_div($1,$3); } - | term MOD_SYM factor { $$= new Item_func_mod($1,$3); } - | factor ; + term '*' factor { $$= new Item_func_mul($1,$3); } + | term '/' factor { $$= new Item_func_div($1,$3); } + | term '%' factor { $$= new Item_func_mod($1,$3); } + | term DIV_SYM factor { $$= new Item_func_int_div($1,$3); } + | term MOD_SYM factor { $$= new Item_func_mod($1,$3); } + | factor + ; factor: - factor '^' simple_expr { $$= new Item_func_bit_xor($1,$3); } - | simple_expr ; + factor '^' simple_expr { $$= new Item_func_bit_xor($1,$3); } + | simple_expr + ; -or: OR_SYM | OR2_SYM; -and: AND_SYM | AND_AND_SYM; -not: NOT_SYM | NOT2_SYM; -not2: '!' | NOT2_SYM; +or: + OR_SYM + | OR2_SYM + ; -comp_op: EQ { $$ = &comp_eq_creator; } - | GE { $$ = &comp_ge_creator; } - | GT_SYM { $$ = &comp_gt_creator; } - | LE { $$ = &comp_le_creator; } - | LT { $$ = &comp_lt_creator; } - | NE { $$ = &comp_ne_creator; } - ; +and: + AND_SYM + | AND_AND_SYM + ; -all_or_any: ALL { $$ = 1; } - | ANY_SYM { $$ = 0; } +not: + NOT_SYM + | NOT2_SYM + ; + +not2: + '!' + | NOT2_SYM + ; + +comp_op: + EQ { $$ = &comp_eq_creator; } + | GE { $$ = &comp_ge_creator; } + | GT_SYM { $$ = &comp_gt_creator; } + | LE { $$ = &comp_le_creator; } + | LT { $$ = &comp_lt_creator; } + | NE { $$ = &comp_ne_creator; } + ; + +all_or_any: + ALL { $$ = 1; } + | ANY_SYM { $$ = 0; } ; interval_expr: - INTERVAL_SYM expr { $$=$2; } + INTERVAL_SYM expr { $$=$2; } ; simple_expr: - simple_ident + simple_ident | function_call_keyword | function_call_nonkeyword | function_call_generic | function_call_conflict - | simple_expr COLLATE_SYM ident_or_text %prec NEG - { + | simple_expr COLLATE_SYM ident_or_text %prec NEG + { THD *thd= YYTHD; Item *i1= new (thd->mem_root) Item_string($3.str, $3.length, thd->charset()); - $$= new (thd->mem_root) Item_func_set_collation($1, i1); - } - | literal - | param_marker - | variable - | sum_expr - | simple_expr OR_OR_SYM simple_expr - { $$= new (YYTHD->mem_root) Item_func_concat($1, $3); } - | '+' simple_expr %prec NEG { $$= $2; } - | '-' simple_expr %prec NEG + $$= new (thd->mem_root) Item_func_set_collation($1, i1); + } + | literal + | param_marker + | variable + | sum_expr + | simple_expr OR_OR_SYM simple_expr + { $$= new (YYTHD->mem_root) Item_func_concat($1, $3); } + | '+' simple_expr %prec NEG { $$= $2; } + | '-' simple_expr %prec NEG { $$= new (YYTHD->mem_root) Item_func_neg($2); } - | '~' simple_expr %prec NEG + | '~' simple_expr %prec NEG { $$= new (YYTHD->mem_root) Item_func_bit_neg($2); } - | not2 simple_expr %prec NEG + | not2 simple_expr %prec NEG { $$= negate_expression(YYTHD, $2); } - | '(' subselect ')' + | '(' subselect ')' { $$= new (YYTHD->mem_root) Item_singlerow_subselect($2); } - | '(' expr ')' { $$= $2; } - | '(' expr ',' expr_list ')' - { - $4->push_front($2); - $$= new (YYTHD->mem_root) Item_row(*$4); - } - | ROW_SYM '(' expr ',' expr_list ')' - { - $5->push_front($3); - $$= new (YYTHD->mem_root) Item_row(*$5); - } - | EXISTS '(' subselect ')' + | '(' expr ')' { $$= $2; } + | '(' expr ',' expr_list ')' + { + $4->push_front($2); + $$= new (YYTHD->mem_root) Item_row(*$4); + } + | ROW_SYM '(' expr ',' expr_list ')' + { + $5->push_front($3); + $$= new (YYTHD->mem_root) Item_row(*$5); + } + | EXISTS '(' subselect ')' { $$= new (YYTHD->mem_root) Item_exists_subselect($3); } - | '{' ident expr '}' { $$= $3; } + | '{' ident expr '}' { $$= $3; } | MATCH ident_list_arg AGAINST '(' bit_expr fulltext_options ')' { $2->push_front($5); @@ -6519,50 +6818,52 @@ simple_expr: Select->add_ftfunc_to_list(i1); $$= i1; } - | BINARY simple_expr %prec NEG - { + | BINARY simple_expr %prec NEG + { $$= create_func_cast(YYTHD, $2, ITEM_CAST_CHAR, NULL, NULL, &my_charset_bin); - } - | CAST_SYM '(' expr AS cast_type ')' - { + } + | CAST_SYM '(' expr AS cast_type ')' + { LEX *lex= Lex; - $$= create_func_cast(YYTHD, $3, $5, lex->length, lex->dec, + $$= create_func_cast(YYTHD, $3, $5, lex->length, lex->dec, lex->charset); if (!$$) MYSQL_YYABORT; - } - | CASE_SYM opt_expr when_list opt_else END - { $$= new (YYTHD->mem_root) Item_func_case(* $3, $2, $4 ); } - | CONVERT_SYM '(' expr ',' cast_type ')' - { - $$= create_func_cast(YYTHD, $3, $5, Lex->length, Lex->dec, + } + | CASE_SYM opt_expr when_list opt_else END + { $$= new (YYTHD->mem_root) Item_func_case(* $3, $2, $4 ); } + | CONVERT_SYM '(' expr ',' cast_type ')' + { + $$= create_func_cast(YYTHD, $3, $5, Lex->length, Lex->dec, Lex->charset); if (!$$) MYSQL_YYABORT; - } - | CONVERT_SYM '(' expr USING charset_name ')' - { $$= new (YYTHD->mem_root) Item_func_conv_charset($3,$5); } - | DEFAULT '(' simple_ident ')' - { - if ($3->is_splocal()) - { - Item_splocal *il= static_cast($3); + } + | CONVERT_SYM '(' expr USING charset_name ')' + { $$= new (YYTHD->mem_root) Item_func_conv_charset($3,$5); } + | DEFAULT '(' simple_ident ')' + { + if ($3->is_splocal()) + { + Item_splocal *il= static_cast($3); - my_error(ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str); - MYSQL_YYABORT; - } - $$= new (YYTHD->mem_root) Item_default_value(Lex->current_context(), + my_error(ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str); + MYSQL_YYABORT; + } + $$= new (YYTHD->mem_root) Item_default_value(Lex->current_context(), $3); - } - | VALUES '(' simple_ident_nospvar ')' - { $$= new (YYTHD->mem_root) Item_insert_value(Lex->current_context(), - $3); } - | interval_expr interval '+' expr - /* we cannot put interval before - */ - { $$= new (YYTHD->mem_root) Item_date_add_interval($4,$1,$2,0); } - | interval_expr - { + } + | VALUES '(' simple_ident_nospvar ')' + { + $$= new (YYTHD->mem_root) Item_insert_value(Lex->current_context(), + $3); + } + | interval_expr interval '+' expr + /* we cannot put interval before - */ + { $$= new (YYTHD->mem_root) Item_date_add_interval($4,$1,$2,0); } + | interval_expr + { if ($1->type() != Item::ROW_ITEM) { my_parse_error(ER(ER_SYNTAX_ERROR)); @@ -6579,62 +6880,62 @@ simple_expr: There is no potential for conflicts */ function_call_keyword: - CHAR_SYM '(' expr_list ')' - { $$= new (YYTHD->mem_root) Item_func_char(*$3); } - | CHAR_SYM '(' expr_list USING charset_name ')' - { $$= new (YYTHD->mem_root) Item_func_char(*$3, $5); } - | CURRENT_USER optional_braces + CHAR_SYM '(' expr_list ')' + { $$= new (YYTHD->mem_root) Item_func_char(*$3); } + | CHAR_SYM '(' expr_list USING charset_name ')' + { $$= new (YYTHD->mem_root) Item_func_char(*$3, $5); } + | CURRENT_USER optional_braces { $$= new (YYTHD->mem_root) Item_func_current_user(Lex->current_context()); Lex->safe_to_cache_query= 0; } - | DATE_SYM '(' expr ')' - { $$= new (YYTHD->mem_root) Item_date_typecast($3); } - | DAY_SYM '(' expr ')' - { $$= new (YYTHD->mem_root) Item_func_dayofmonth($3); } - | HOUR_SYM '(' expr ')' - { $$= new (YYTHD->mem_root) Item_func_hour($3); } - | INSERT '(' expr ',' expr ',' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_insert($3,$5,$7,$9); } - | LEFT '(' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_left($3,$5); } - | MINUTE_SYM '(' expr ')' - { $$= new (YYTHD->mem_root) Item_func_minute($3); } - | MONTH_SYM '(' expr ')' - { $$= new (YYTHD->mem_root) Item_func_month($3); } - | RIGHT '(' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_right($3,$5); } - | SECOND_SYM '(' expr ')' - { $$= new (YYTHD->mem_root) Item_func_second($3); } - | TIME_SYM '(' expr ')' - { $$= new (YYTHD->mem_root) Item_time_typecast($3); } - | TIMESTAMP '(' expr ')' - { $$= new (YYTHD->mem_root) Item_datetime_typecast($3); } - | TIMESTAMP '(' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_add_time($3, $5, 1, 0); } - | TRIM '(' expr ')' - { $$= new (YYTHD->mem_root) Item_func_trim($3); } - | TRIM '(' LEADING expr FROM expr ')' - { $$= new (YYTHD->mem_root) Item_func_ltrim($6,$4); } - | TRIM '(' TRAILING expr FROM expr ')' - { $$= new (YYTHD->mem_root) Item_func_rtrim($6,$4); } - | TRIM '(' BOTH expr FROM expr ')' - { $$= new (YYTHD->mem_root) Item_func_trim($6,$4); } - | TRIM '(' LEADING FROM expr ')' - { $$= new (YYTHD->mem_root) Item_func_ltrim($5); } - | TRIM '(' TRAILING FROM expr ')' - { $$= new (YYTHD->mem_root) Item_func_rtrim($5); } - | TRIM '(' BOTH FROM expr ')' - { $$= new (YYTHD->mem_root) Item_func_trim($5); } - | TRIM '(' expr FROM expr ')' - { $$= new (YYTHD->mem_root) Item_func_trim($5,$3); } - | USER '(' ')' - { + | DATE_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_date_typecast($3); } + | DAY_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_dayofmonth($3); } + | HOUR_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_hour($3); } + | INSERT '(' expr ',' expr ',' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_insert($3,$5,$7,$9); } + | LEFT '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_left($3,$5); } + | MINUTE_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_minute($3); } + | MONTH_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_month($3); } + | RIGHT '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_right($3,$5); } + | SECOND_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_second($3); } + | TIME_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_time_typecast($3); } + | TIMESTAMP '(' expr ')' + { $$= new (YYTHD->mem_root) Item_datetime_typecast($3); } + | TIMESTAMP '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_add_time($3, $5, 1, 0); } + | TRIM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_trim($3); } + | TRIM '(' LEADING expr FROM expr ')' + { $$= new (YYTHD->mem_root) Item_func_ltrim($6,$4); } + | TRIM '(' TRAILING expr FROM expr ')' + { $$= new (YYTHD->mem_root) Item_func_rtrim($6,$4); } + | TRIM '(' BOTH expr FROM expr ')' + { $$= new (YYTHD->mem_root) Item_func_trim($6,$4); } + | TRIM '(' LEADING FROM expr ')' + { $$= new (YYTHD->mem_root) Item_func_ltrim($5); } + | TRIM '(' TRAILING FROM expr ')' + { $$= new (YYTHD->mem_root) Item_func_rtrim($5); } + | TRIM '(' BOTH FROM expr ')' + { $$= new (YYTHD->mem_root) Item_func_trim($5); } + | TRIM '(' expr FROM expr ')' + { $$= new (YYTHD->mem_root) Item_func_trim($5,$3); } + | USER '(' ')' + { $$= new (YYTHD->mem_root) Item_func_user(); Lex->safe_to_cache_query=0; } - | YEAR_SYM '(' expr ')' - { $$= new (YYTHD->mem_root) Item_func_year($3); } + | YEAR_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_year($3); } ; /* @@ -6650,64 +6951,64 @@ function_call_keyword: discouraged. */ function_call_nonkeyword: - ADDDATE_SYM '(' expr ',' expr ')' - { + ADDDATE_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_date_add_interval($3, $5, INTERVAL_DAY, 0); } - | ADDDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' - { $$= new (YYTHD->mem_root) Item_date_add_interval($3, $6, $7, 0); } - | CURDATE optional_braces - { + | ADDDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' + { $$= new (YYTHD->mem_root) Item_date_add_interval($3, $6, $7, 0); } + | CURDATE optional_braces + { $$= new (YYTHD->mem_root) Item_func_curdate_local(); Lex->safe_to_cache_query=0; } - | CURTIME optional_braces - { + | CURTIME optional_braces + { $$= new (YYTHD->mem_root) Item_func_curtime_local(); Lex->safe_to_cache_query=0; } - | CURTIME '(' expr ')' - { - $$= new (YYTHD->mem_root) Item_func_curtime_local($3); - Lex->safe_to_cache_query=0; - } - | DATE_ADD_INTERVAL '(' expr ',' interval_expr interval ')' - { $$= new (YYTHD->mem_root) Item_date_add_interval($3,$5,$6,0); } - | DATE_SUB_INTERVAL '(' expr ',' interval_expr interval ')' - { $$= new (YYTHD->mem_root) Item_date_add_interval($3,$5,$6,1); } - | EXTRACT_SYM '(' interval FROM expr ')' - { $$=new (YYTHD->mem_root) Item_extract( $3, $5); } - | GET_FORMAT '(' date_time_type ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_get_format($3, $5); } - | NOW_SYM optional_braces - { + | CURTIME '(' expr ')' + { + $$= new (YYTHD->mem_root) Item_func_curtime_local($3); + Lex->safe_to_cache_query=0; + } + | DATE_ADD_INTERVAL '(' expr ',' interval_expr interval ')' + { $$= new (YYTHD->mem_root) Item_date_add_interval($3,$5,$6,0); } + | DATE_SUB_INTERVAL '(' expr ',' interval_expr interval ')' + { $$= new (YYTHD->mem_root) Item_date_add_interval($3,$5,$6,1); } + | EXTRACT_SYM '(' interval FROM expr ')' + { $$=new (YYTHD->mem_root) Item_extract( $3, $5); } + | GET_FORMAT '(' date_time_type ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_get_format($3, $5); } + | NOW_SYM optional_braces + { $$= new (YYTHD->mem_root) Item_func_now_local(); Lex->safe_to_cache_query=0; } - | NOW_SYM '(' expr ')' - { + | NOW_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_now_local($3); Lex->safe_to_cache_query=0; } - | POSITION_SYM '(' bit_expr IN_SYM expr ')' - { $$ = new (YYTHD->mem_root) Item_func_locate($5,$3); } - | SUBDATE_SYM '(' expr ',' expr ')' - { + | POSITION_SYM '(' bit_expr IN_SYM expr ')' + { $$ = new (YYTHD->mem_root) Item_func_locate($5,$3); } + | SUBDATE_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_date_add_interval($3, $5, INTERVAL_DAY, 1); } - | SUBDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' - { $$= new (YYTHD->mem_root) Item_date_add_interval($3, $6, $7, 1); } - | SUBSTRING '(' expr ',' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_substr($3,$5,$7); } - | SUBSTRING '(' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_substr($3,$5); } - | SUBSTRING '(' expr FROM expr FOR_SYM expr ')' - { $$= new (YYTHD->mem_root) Item_func_substr($3,$5,$7); } - | SUBSTRING '(' expr FROM expr ')' - { $$= new (YYTHD->mem_root) Item_func_substr($3,$5); } - | SYSDATE optional_braces + | SUBDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' + { $$= new (YYTHD->mem_root) Item_date_add_interval($3, $6, $7, 1); } + | SUBSTRING '(' expr ',' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_substr($3,$5,$7); } + | SUBSTRING '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_substr($3,$5); } + | SUBSTRING '(' expr FROM expr FOR_SYM expr ')' + { $$= new (YYTHD->mem_root) Item_func_substr($3,$5,$7); } + | SUBSTRING '(' expr FROM expr ')' + { $$= new (YYTHD->mem_root) Item_func_substr($3,$5); } + | SYSDATE optional_braces { if (global_system_variables.sysdate_is_now == 0) $$= new (YYTHD->mem_root) Item_func_sysdate_local(); @@ -6715,7 +7016,7 @@ function_call_nonkeyword: $$= new (YYTHD->mem_root) Item_func_now_local(); Lex->safe_to_cache_query=0; } - | SYSDATE '(' expr ')' + | SYSDATE '(' expr ')' { if (global_system_variables.sysdate_is_now == 0) $$= new (YYTHD->mem_root) Item_func_sysdate_local($3); @@ -6723,22 +7024,22 @@ function_call_nonkeyword: $$= new (YYTHD->mem_root) Item_func_now_local($3); Lex->safe_to_cache_query=0; } - | TIMESTAMP_ADD '(' interval_time_st ',' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_date_add_interval($7,$5,$3,0); } - | TIMESTAMP_DIFF '(' interval_time_st ',' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_timestamp_diff($5,$7,$3); } - | UTC_DATE_SYM optional_braces - { + | TIMESTAMP_ADD '(' interval_time_st ',' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_date_add_interval($7,$5,$3,0); } + | TIMESTAMP_DIFF '(' interval_time_st ',' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_timestamp_diff($5,$7,$3); } + | UTC_DATE_SYM optional_braces + { $$= new (YYTHD->mem_root) Item_func_curdate_utc(); Lex->safe_to_cache_query=0; } - | UTC_TIME_SYM optional_braces - { + | UTC_TIME_SYM optional_braces + { $$= new (YYTHD->mem_root) Item_func_curtime_utc(); Lex->safe_to_cache_query=0; } - | UTC_TIMESTAMP_SYM optional_braces - { + | UTC_TIMESTAMP_SYM optional_braces + { $$= new (YYTHD->mem_root) Item_func_now_utc(); Lex->safe_to_cache_query=0; } @@ -6750,29 +7051,29 @@ function_call_nonkeyword: a dedicated rule is needed here. */ function_call_conflict: - ASCII_SYM '(' expr ')' + ASCII_SYM '(' expr ')' { $$= new (YYTHD->mem_root) Item_func_ascii($3); } - | CHARSET '(' expr ')' - { $$= new (YYTHD->mem_root) Item_func_charset($3); } - | COALESCE '(' expr_list ')' - { $$= new (YYTHD->mem_root) Item_func_coalesce(* $3); } - | COLLATION_SYM '(' expr ')' - { $$= new (YYTHD->mem_root) Item_func_collation($3); } - | DATABASE '(' ')' - { - $$= new (YYTHD->mem_root) Item_func_database(); + | CHARSET '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_charset($3); } + | COALESCE '(' expr_list ')' + { $$= new (YYTHD->mem_root) Item_func_coalesce(* $3); } + | COLLATION_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_collation($3); } + | DATABASE '(' ')' + { + $$= new (YYTHD->mem_root) Item_func_database(); Lex->safe_to_cache_query=0; - } - | IF '(' expr ',' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_if($3,$5,$7); } - | MICROSECOND_SYM '(' expr ')' - { $$= new (YYTHD->mem_root) Item_func_microsecond($3); } - | MOD_SYM '(' expr ',' expr ')' - { $$ = new (YYTHD->mem_root) Item_func_mod( $3, $5); } - | OLD_PASSWORD '(' expr ')' - { $$= new (YYTHD->mem_root) Item_func_old_password($3); } - | PASSWORD '(' expr ')' - { + } + | IF '(' expr ',' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_if($3,$5,$7); } + | MICROSECOND_SYM '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_microsecond($3); } + | MOD_SYM '(' expr ',' expr ')' + { $$ = new (YYTHD->mem_root) Item_func_mod( $3, $5); } + | OLD_PASSWORD '(' expr ')' + { $$= new (YYTHD->mem_root) Item_func_old_password($3); } + | PASSWORD '(' expr ')' + { THD *thd= YYTHD; Item* i1; if (thd->variables.old_passwords) @@ -6780,17 +7081,17 @@ function_call_conflict: else i1= new (thd->mem_root) Item_func_password($3); $$= i1; - } - | QUARTER_SYM '(' expr ')' - { $$ = new (YYTHD->mem_root) Item_func_quarter($3); } - | REPEAT_SYM '(' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_repeat($3,$5); } - | REPLACE '(' expr ',' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_replace($3,$5,$7); } - | TRUNCATE_SYM '(' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_round($3,$5,1); } - | WEEK_SYM '(' expr ')' - { + } + | QUARTER_SYM '(' expr ')' + { $$ = new (YYTHD->mem_root) Item_func_quarter($3); } + | REPEAT_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_repeat($3,$5); } + | REPLACE '(' expr ',' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_replace($3,$5,$7); } + | TRUNCATE_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_round($3,$5,1); } + | WEEK_SYM '(' expr ')' + { THD *thd= YYTHD; Item *i1= new (thd->mem_root) Item_int((char*) "0", thd->variables.default_week_format, @@ -6798,8 +7099,8 @@ function_call_conflict: $$= new (thd->mem_root) Item_func_week($3, i1); } - | WEEK_SYM '(' expr ',' expr ')' - { $$= new (YYTHD->mem_root) Item_func_week($3,$5); } + | WEEK_SYM '(' expr ',' expr ')' + { $$= new (YYTHD->mem_root) Item_func_week($3,$5); } | geometry_function { #ifdef HAVE_SPATIAL @@ -6813,54 +7114,54 @@ function_call_conflict: ; geometry_function: - CONTAINS_SYM '(' expr ',' expr ')' - { + CONTAINS_SYM '(' expr ',' expr ')' + { $$= GEOM_NEW(YYTHD, Item_func_spatial_rel($3, $5, Item_func::SP_CONTAINS_FUNC)); } - | GEOMETRYCOLLECTION '(' expr_list ')' - { + | GEOMETRYCOLLECTION '(' expr_list ')' + { $$= GEOM_NEW(YYTHD, Item_func_spatial_collection(* $3, Geometry::wkb_geometrycollection, Geometry::wkb_point)); } - | LINESTRING '(' expr_list ')' - { + | LINESTRING '(' expr_list ')' + { $$= GEOM_NEW(YYTHD, Item_func_spatial_collection(* $3, Geometry::wkb_linestring, Geometry::wkb_point)); } - | MULTILINESTRING '(' expr_list ')' - { + | MULTILINESTRING '(' expr_list ')' + { $$= GEOM_NEW(YYTHD, Item_func_spatial_collection(* $3, Geometry::wkb_multilinestring, Geometry::wkb_linestring)); } - | MULTIPOINT '(' expr_list ')' - { + | MULTIPOINT '(' expr_list ')' + { $$= GEOM_NEW(YYTHD, Item_func_spatial_collection(* $3, Geometry::wkb_multipoint, Geometry::wkb_point)); } - | MULTIPOLYGON '(' expr_list ')' - { + | MULTIPOLYGON '(' expr_list ')' + { $$= GEOM_NEW(YYTHD, Item_func_spatial_collection(* $3, Geometry::wkb_multipolygon, Geometry::wkb_polygon)); } - | POINT_SYM '(' expr ',' expr ')' - { $$= GEOM_NEW(YYTHD, Item_func_point($3,$5)); } - | POLYGON '(' expr_list ')' - { + | POINT_SYM '(' expr ',' expr ')' + { $$= GEOM_NEW(YYTHD, Item_func_point($3,$5)); } + | POLYGON '(' expr_list ')' + { $$= GEOM_NEW(YYTHD, Item_func_spatial_collection(* $3, - Geometry::wkb_polygon, + Geometry::wkb_polygon, Geometry::wkb_linestring)); } ; @@ -6875,103 +7176,103 @@ geometry_function: in sql/item_create.cc */ function_call_generic: - IDENT_sys '(' - { -#ifdef HAVE_DLOPEN - udf_func *udf= 0; - LEX *lex= Lex; - if (using_udf_functions && - (udf= find_udf($1.str, $1.length)) && - udf->type == UDFTYPE_AGGREGATE) + IDENT_sys '(' { - if (lex->current_select->inc_in_sum_expr()) +#ifdef HAVE_DLOPEN + udf_func *udf= 0; + LEX *lex= Lex; + if (using_udf_functions && + (udf= find_udf($1.str, $1.length)) && + udf->type == UDFTYPE_AGGREGATE) + { + if (lex->current_select->inc_in_sum_expr()) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + } + /* Temporary placing the result of find_udf in $3 */ + $$= udf; +#endif + } + udf_expr_list ')' + { + THD *thd= YYTHD; + Create_func *builder; + Item *item= NULL; + + /* + Implementation note: + names are resolved with the following order: + - MySQL native functions, + - User Defined Functions, + - Stored Functions (assuming the current database) + + This will be revised with WL#2128 (SQL PATH) + */ + builder= find_native_function_builder(thd, $1); + if (builder) + { + item= builder->create(thd, $1, $4); + } + else + { +#ifdef HAVE_DLOPEN + /* Retrieving the result of find_udf */ + udf_func *udf= $3; + + if (udf) + { + if (udf->type == UDFTYPE_AGGREGATE) + { + Select->in_sum_expr--; + } + + item= Create_udf_func::s_singleton.create(thd, udf, $4); + } + else +#endif + { + builder= find_qualified_function_builder(thd); + DBUG_ASSERT(builder); + item= builder->create(thd, $1, $4); + } + } + + if (! ($$= item)) { - my_parse_error(ER(ER_SYNTAX_ERROR)); MYSQL_YYABORT; } } - /* Temporary placing the result of find_udf in $3 */ - $$= udf; -#endif - } - udf_expr_list ')' - { - THD *thd= YYTHD; - Create_func *builder; - Item *item= NULL; - - /* - Implementation note: - names are resolved with the following order: - - MySQL native functions, - - User Defined Functions, - - Stored Functions (assuming the current database) - - This will be revised with WL#2128 (SQL PATH) - */ - builder= find_native_function_builder(thd, $1); - if (builder) + | ident '.' ident '(' opt_expr_list ')' { - item= builder->create(thd, $1, $4); - } - else - { -#ifdef HAVE_DLOPEN - /* Retrieving the result of find_udf */ - udf_func *udf= $3; + THD *thd= YYTHD; + Create_qfunc *builder; + Item *item= NULL; - if (udf) - { - if (udf->type == UDFTYPE_AGGREGATE) - { - Select->in_sum_expr--; - } + /* + The following in practice calls: + Create_sp_func::create() + and builds a stored function. - item= Create_udf_func::s_singleton.create(thd, udf, $4); - } - else -#endif + However, it's important to maintain the interface between the + parser and the implementation in item_create.cc clean, + since this will change with WL#2128 (SQL PATH): + - INFORMATION_SCHEMA.version() is the SQL 99 syntax for the native + function version(), + - MySQL.version() is the SQL 2003 syntax for the native function + version() (a vendor can specify any schema). + */ + + builder= find_qualified_function_builder(thd); + DBUG_ASSERT(builder); + item= builder->create(thd, $1, $3, true, $5); + + if (! ($$= item)) { - builder= find_qualified_function_builder(thd); - DBUG_ASSERT(builder); - item= builder->create(thd, $1, $4); + MYSQL_YYABORT; } } - - if (! ($$= item)) - { - MYSQL_YYABORT; - } - } - | ident '.' ident '(' opt_expr_list ')' - { - THD *thd= YYTHD; - Create_qfunc *builder; - Item *item= NULL; - - /* - The following in practice calls: - Create_sp_func::create() - and builds a stored function. - - However, it's important to maintain the interface between the - parser and the implementation in item_create.cc clean, - since this will change with WL#2128 (SQL PATH): - - INFORMATION_SCHEMA.version() is the SQL 99 syntax for the native - function version(), - - MySQL.version() is the SQL 2003 syntax for the native function - version() (a vendor can specify any schema). - */ - - builder= find_qualified_function_builder(thd); - DBUG_ASSERT(builder); - item= builder->create(thd, $1, $3, true, $5); - - if (! ($$= item)) - { - MYSQL_YYABORT; - } - } ; fulltext_options: @@ -6982,12 +7283,12 @@ fulltext_options: ; opt_natural_language_mode: - /* nothing */ { $$= FT_NL; } + /* nothing */ { $$= FT_NL; } | IN_SYM NATURAL LANGUAGE_SYM MODE_SYM { $$= FT_NL; } ; opt_query_expansion: - /* nothing */ { $$= 0; } + /* nothing */ { $$= 0; } | WITH QUERY_SYM EXPANSION_SYM { $$= FT_EXPAND; } ; @@ -7014,83 +7315,84 @@ udf_expr_list3: ; udf_expr: - remember_name expr remember_end select_alias - { - /* - Use Item::name as a storage for the attribute value of user - defined function argument. It is safe to use Item::name - because the syntax will not allow having an explicit name here. - See WL#1017 re. udf attributes. - */ - if ($4.str) + remember_name expr remember_end select_alias { - $2->is_autogenerated_name= FALSE; - $2->set_name($4.str, $4.length, system_charset_info); + /* + Use Item::name as a storage for the attribute value of user + defined function argument. It is safe to use Item::name + because the syntax will not allow having an explicit name here. + See WL#1017 re. udf attributes. + */ + if ($4.str) + { + $2->is_autogenerated_name= FALSE; + $2->set_name($4.str, $4.length, system_charset_info); + } + else + $2->set_name($1, (uint) ($3 - $1), YYTHD->charset()); + $$= $2; } - else - $2->set_name($1, (uint) ($3 - $1), YYTHD->charset()); - $$= $2; - } - ; + ; sum_expr: - AVG_SYM '(' in_sum_expr ')' - { $$=new Item_sum_avg($3); } - | AVG_SYM '(' DISTINCT in_sum_expr ')' - { $$=new Item_sum_avg_distinct($4); } - | BIT_AND '(' in_sum_expr ')' - { $$=new Item_sum_and($3); } - | BIT_OR '(' in_sum_expr ')' - { $$=new Item_sum_or($3); } - | BIT_XOR '(' in_sum_expr ')' - { $$=new Item_sum_xor($3); } - | COUNT_SYM '(' opt_all '*' ')' - { $$=new Item_sum_count(new Item_int((int32) 0L,1)); } - | COUNT_SYM '(' in_sum_expr ')' - { $$=new Item_sum_count($3); } - | COUNT_SYM '(' DISTINCT - { Select->in_sum_expr++; } - expr_list - { Select->in_sum_expr--; } - ')' - { $$=new Item_sum_count_distinct(* $5); } - | MIN_SYM '(' in_sum_expr ')' - { $$=new Item_sum_min($3); } -/* - According to ANSI SQL, DISTINCT is allowed and has - no sense inside MIN and MAX grouping functions; so MIN|MAX(DISTINCT ...) - is processed like an ordinary MIN | MAX() - */ - | MIN_SYM '(' DISTINCT in_sum_expr ')' - { $$=new Item_sum_min($4); } - | MAX_SYM '(' in_sum_expr ')' - { $$=new Item_sum_max($3); } - | MAX_SYM '(' DISTINCT in_sum_expr ')' - { $$=new Item_sum_max($4); } - | STD_SYM '(' in_sum_expr ')' - { $$=new Item_sum_std($3, 0); } - | VARIANCE_SYM '(' in_sum_expr ')' - { $$=new Item_sum_variance($3, 0); } - | STDDEV_SAMP_SYM '(' in_sum_expr ')' - { $$=new Item_sum_std($3, 1); } - | VAR_SAMP_SYM '(' in_sum_expr ')' - { $$=new Item_sum_variance($3, 1); } - | SUM_SYM '(' in_sum_expr ')' - { $$=new Item_sum_sum($3); } - | SUM_SYM '(' DISTINCT in_sum_expr ')' - { $$=new Item_sum_sum_distinct($4); } - | GROUP_CONCAT_SYM '(' opt_distinct - { Select->in_sum_expr++; } - expr_list opt_gorder_clause - opt_gconcat_separator - ')' - { + AVG_SYM '(' in_sum_expr ')' + { $$=new Item_sum_avg($3); } + | AVG_SYM '(' DISTINCT in_sum_expr ')' + { $$=new Item_sum_avg_distinct($4); } + | BIT_AND '(' in_sum_expr ')' + { $$=new Item_sum_and($3); } + | BIT_OR '(' in_sum_expr ')' + { $$=new Item_sum_or($3); } + | BIT_XOR '(' in_sum_expr ')' + { $$=new Item_sum_xor($3); } + | COUNT_SYM '(' opt_all '*' ')' + { $$=new Item_sum_count(new Item_int((int32) 0L,1)); } + | COUNT_SYM '(' in_sum_expr ')' + { $$=new Item_sum_count($3); } + | COUNT_SYM '(' DISTINCT + { Select->in_sum_expr++; } + expr_list + { Select->in_sum_expr--; } + ')' + { $$=new Item_sum_count_distinct(* $5); } + | MIN_SYM '(' in_sum_expr ')' + { $$=new Item_sum_min($3); } + /* + According to ANSI SQL, DISTINCT is allowed and has + no sense inside MIN and MAX grouping functions; so MIN|MAX(DISTINCT ...) + is processed like an ordinary MIN | MAX() + */ + | MIN_SYM '(' DISTINCT in_sum_expr ')' + { $$=new Item_sum_min($4); } + | MAX_SYM '(' in_sum_expr ')' + { $$=new Item_sum_max($3); } + | MAX_SYM '(' DISTINCT in_sum_expr ')' + { $$=new Item_sum_max($4); } + | STD_SYM '(' in_sum_expr ')' + { $$=new Item_sum_std($3, 0); } + | VARIANCE_SYM '(' in_sum_expr ')' + { $$=new Item_sum_variance($3, 0); } + | STDDEV_SAMP_SYM '(' in_sum_expr ')' + { $$=new Item_sum_std($3, 1); } + | VAR_SAMP_SYM '(' in_sum_expr ')' + { $$=new Item_sum_variance($3, 1); } + | SUM_SYM '(' in_sum_expr ')' + { $$=new Item_sum_sum($3); } + | SUM_SYM '(' DISTINCT in_sum_expr ')' + { $$=new Item_sum_sum_distinct($4); } + | GROUP_CONCAT_SYM '(' opt_distinct + { Select->in_sum_expr++; } + expr_list opt_gorder_clause + opt_gconcat_separator + ')' + { SELECT_LEX *sel= Select; - sel->in_sum_expr--; - $$=new Item_func_group_concat(Lex->current_context(), $3, $5, + sel->in_sum_expr--; + $$=new Item_func_group_concat(Lex->current_context(), $3, $5, sel->gorder_list, $7); - $5->empty(); - }; + $5->empty(); + } + ; variable: '@' @@ -7105,7 +7407,7 @@ variable: { $$= $3; } - ; + ; variable_aux: ident_or_text SET_VAR expr @@ -7133,66 +7435,79 @@ variable_aux: ; opt_distinct: - /* empty */ { $$ = 0; } - |DISTINCT { $$ = 1; }; + /* empty */ { $$ = 0; } + | DISTINCT { $$ = 1; } + ; opt_gconcat_separator: - /* empty */ - { - $$= new (YYTHD->mem_root) String(",", 1, &my_charset_latin1); - } - | SEPARATOR_SYM text_string { $$ = $2; }; - + /* empty */ + { + $$= new (YYTHD->mem_root) String(",", 1, &my_charset_latin1); + } + | SEPARATOR_SYM text_string { $$ = $2; } + ; opt_gorder_clause: - /* empty */ - { + /* empty */ + { Select->gorder_list = NULL; - } - | order_clause + } + | order_clause { SELECT_LEX *select= Select; select->gorder_list= - (SQL_LIST*) sql_memdup((char*) &select->order_list, - sizeof(st_sql_list)); - select->order_list.empty(); - }; - + (SQL_LIST*) sql_memdup((char*) &select->order_list, + sizeof(st_sql_list)); + select->order_list.empty(); + } + ; in_sum_expr: - opt_all - { - LEX *lex= Lex; - if (lex->current_select->inc_in_sum_expr()) - { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } - } - expr - { - Select->in_sum_expr--; - $$= $3; - }; + opt_all + { + LEX *lex= Lex; + if (lex->current_select->inc_in_sum_expr()) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + } + expr + { + Select->in_sum_expr--; + $$= $3; + } + ; cast_type: - BINARY opt_len { $$=ITEM_CAST_CHAR; Lex->charset= &my_charset_bin; Lex->dec= 0; } - | CHAR_SYM opt_len opt_binary { $$=ITEM_CAST_CHAR; Lex->dec= 0; } - | NCHAR_SYM opt_len { $$=ITEM_CAST_CHAR; Lex->charset= national_charset_info; Lex->dec=0; } - | SIGNED_SYM { $$=ITEM_CAST_SIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } - | SIGNED_SYM INT_SYM { $$=ITEM_CAST_SIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } - | UNSIGNED { $$=ITEM_CAST_UNSIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } - | UNSIGNED INT_SYM { $$=ITEM_CAST_UNSIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } - | DATE_SYM { $$=ITEM_CAST_DATE; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } - | TIME_SYM { $$=ITEM_CAST_TIME; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } - | DATETIME { $$=ITEM_CAST_DATETIME; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } - | DECIMAL_SYM float_options { $$=ITEM_CAST_DECIMAL; Lex->charset= NULL; } - ; + BINARY opt_len + { $$=ITEM_CAST_CHAR; Lex->charset= &my_charset_bin; Lex->dec= 0; } + | CHAR_SYM opt_len opt_binary + { $$=ITEM_CAST_CHAR; Lex->dec= 0; } + | NCHAR_SYM opt_len + { $$=ITEM_CAST_CHAR; Lex->charset= national_charset_info; Lex->dec=0; } + | SIGNED_SYM + { $$=ITEM_CAST_SIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } + | SIGNED_SYM INT_SYM + { $$=ITEM_CAST_SIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } + | UNSIGNED + { $$=ITEM_CAST_UNSIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } + | UNSIGNED INT_SYM + { $$=ITEM_CAST_UNSIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } + | DATE_SYM + { $$=ITEM_CAST_DATE; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } + | TIME_SYM + { $$=ITEM_CAST_TIME; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } + | DATETIME + { $$=ITEM_CAST_DATETIME; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } + | DECIMAL_SYM float_options + { $$=ITEM_CAST_DECIMAL; Lex->charset= NULL; } + ; opt_expr_list: - /* empty */ { $$= NULL; } - | expr_list { $$= $1;} - ; + /* empty */ { $$= NULL; } + | expr_list { $$= $1;} + ; expr_list: { Select->expr_list.push_front(new List); } @@ -7205,7 +7520,8 @@ expr_list2: ident_list_arg: ident_list { $$= $1; } - | '(' ident_list ')' { $$= $2; }; + | '(' ident_list ')' { $$= $2; } + ; ident_list: { Select->expr_list.push_front(new List); } @@ -7217,12 +7533,14 @@ ident_list2: | ident_list2 ',' simple_ident { Select->expr_list.head()->push_back($3); }; opt_expr: - /* empty */ { $$= NULL; } - | expr { $$= $1; }; + /* empty */ { $$= NULL; } + | expr { $$= $1; } + ; opt_else: - /* empty */ { $$= NULL; } - | ELSE expr { $$= $2; }; + /* empty */ { $$= NULL; } + | ELSE expr { $$= $2; } + ; when_list: WHEN_SYM expr THEN_SYM expr @@ -7241,22 +7559,22 @@ when_list: /* Warning - may return NULL in case of incomplete SELECT */ table_ref: - table_factor { $$=$1; } + table_factor { $$=$1; } | join_table { - LEX *lex= Lex; + LEX *lex= Lex; if (!($$= lex->current_select->nest_last_join(lex->thd))) MYSQL_YYABORT; } ; join_table_list: - derived_table_list { MYSQL_YYABORT_UNLESS($$=$1); } - ; + derived_table_list { MYSQL_YYABORT_UNLESS($$=$1); } + ; /* Warning - may return NULL in case of incomplete SELECT */ derived_table_list: - table_ref { $$=$1; } + table_ref { $$=$1; } | derived_table_list ',' table_ref { MYSQL_YYABORT_UNLESS($1 && ($$=$3)); @@ -7271,17 +7589,17 @@ derived_table_list: and subsequent optimization phases. */ join_table: -/* INNER JOIN variants */ - /* - Use %prec to evaluate production 'table_ref' before 'normal_join' - so that [INNER | CROSS] JOIN is properly nested as other - left-associative joins. - */ - table_ref normal_join table_ref %prec TABLE_REF_PRIORITY + /* INNER JOIN variants */ + /* + Use %prec to evaluate production 'table_ref' before 'normal_join' + so that [INNER | CROSS] JOIN is properly nested as other + left-associative joins. + */ + table_ref normal_join table_ref %prec TABLE_REF_PRIORITY { MYSQL_YYABORT_UNLESS($1 && ($$=$3)); } - | table_ref STRAIGHT_JOIN table_factor - { MYSQL_YYABORT_UNLESS($1 && ($$=$3)); $3->straight=1; } - | table_ref normal_join table_ref + | table_ref STRAIGHT_JOIN table_factor + { MYSQL_YYABORT_UNLESS($1 && ($$=$3)); $3->straight=1; } + | table_ref normal_join table_ref ON { MYSQL_YYABORT_UNLESS($1 && $3); @@ -7291,7 +7609,7 @@ join_table: Select->parsing_place= IN_ON; } expr - { + { add_join_on($3,$6); Lex->pop_context(); Select->parsing_place= NO_MATTER; @@ -7312,21 +7630,21 @@ join_table: Lex->pop_context(); Select->parsing_place= NO_MATTER; } - | table_ref normal_join table_ref - USING - { + | table_ref normal_join table_ref + USING + { MYSQL_YYABORT_UNLESS($1 && $3); - } - '(' using_list ')' + } + '(' using_list ')' { add_join_natural($1,$3,$7,Select); $$=$3; } - | table_ref NATURAL JOIN_SYM table_factor - { + | table_ref NATURAL JOIN_SYM table_factor + { MYSQL_YYABORT_UNLESS($1 && ($$=$4)); add_join_natural($1,$4,NULL,Select); } -/* LEFT JOIN variants */ - | table_ref LEFT opt_outer JOIN_SYM table_ref + /* LEFT JOIN variants */ + | table_ref LEFT opt_outer JOIN_SYM table_ref ON { MYSQL_YYABORT_UNLESS($1 && $5); @@ -7336,33 +7654,33 @@ join_table: Select->parsing_place= IN_ON; } expr - { + { add_join_on($5,$8); Lex->pop_context(); $5->outer_join|=JOIN_TYPE_LEFT; $$=$5; Select->parsing_place= NO_MATTER; } - | table_ref LEFT opt_outer JOIN_SYM table_factor - { + | table_ref LEFT opt_outer JOIN_SYM table_factor + { MYSQL_YYABORT_UNLESS($1 && $5); - } - USING '(' using_list ')' + } + USING '(' using_list ')' { add_join_natural($1,$5,$9,Select); $5->outer_join|=JOIN_TYPE_LEFT; $$=$5; } - | table_ref NATURAL LEFT opt_outer JOIN_SYM table_factor - { + | table_ref NATURAL LEFT opt_outer JOIN_SYM table_factor + { MYSQL_YYABORT_UNLESS($1 && $6); - add_join_natural($1,$6,NULL,Select); - $6->outer_join|=JOIN_TYPE_LEFT; - $$=$6; - } + add_join_natural($1,$6,NULL,Select); + $6->outer_join|=JOIN_TYPE_LEFT; + $$=$6; + } -/* RIGHT JOIN variants */ - | table_ref RIGHT opt_outer JOIN_SYM table_ref + /* RIGHT JOIN variants */ + | table_ref RIGHT opt_outer JOIN_SYM table_ref ON { MYSQL_YYABORT_UNLESS($1 && $5); @@ -7373,55 +7691,56 @@ join_table: } expr { - LEX *lex= Lex; + LEX *lex= Lex; if (!($$= lex->current_select->convert_right_join())) MYSQL_YYABORT; add_join_on($$, $8); Lex->pop_context(); Select->parsing_place= NO_MATTER; } - | table_ref RIGHT opt_outer JOIN_SYM table_factor - { - MYSQL_YYABORT_UNLESS($1 && $5); - } - USING '(' using_list ')' + | table_ref RIGHT opt_outer JOIN_SYM table_factor { - LEX *lex= Lex; + MYSQL_YYABORT_UNLESS($1 && $5); + } + USING '(' using_list ')' + { + LEX *lex= Lex; if (!($$= lex->current_select->convert_right_join())) MYSQL_YYABORT; add_join_natural($$,$5,$9,Select); } - | table_ref NATURAL RIGHT opt_outer JOIN_SYM table_factor - { + | table_ref NATURAL RIGHT opt_outer JOIN_SYM table_factor + { MYSQL_YYABORT_UNLESS($1 && $6); - add_join_natural($6,$1,NULL,Select); - LEX *lex= Lex; + add_join_natural($6,$1,NULL,Select); + LEX *lex= Lex; if (!($$= lex->current_select->convert_right_join())) MYSQL_YYABORT; - }; + } + ; normal_join: - JOIN_SYM {} - | INNER_SYM JOIN_SYM {} - | CROSS JOIN_SYM {} - ; + JOIN_SYM {} + | INNER_SYM JOIN_SYM {} + | CROSS JOIN_SYM {} + ; /* Warning - may return NULL in case of incomplete SELECT */ table_factor: - { - SELECT_LEX *sel= Select; - sel->table_join_options= 0; - } - table_ident opt_table_alias opt_key_definition - { - if (!($$= Select->add_table_to_list(YYTHD, $2, $3, - Select->get_table_join_options(), - Lex->lock_option, - Select->pop_index_hints()))) - MYSQL_YYABORT; - Select->add_joined_table($$); - } - | '{' ident table_ref LEFT OUTER JOIN_SYM table_ref + { + SELECT_LEX *sel= Select; + sel->table_join_options= 0; + } + table_ident opt_table_alias opt_key_definition + { + if (!($$= Select->add_table_to_list(YYTHD, $2, $3, + Select->get_table_join_options(), + Lex->lock_option, + Select->pop_index_hints()))) + MYSQL_YYABORT; + Select->add_joined_table($$); + } + | '{' ident table_ref LEFT OUTER JOIN_SYM table_ref ON { /* Change the current name resolution context to a local context. */ @@ -7430,8 +7749,8 @@ table_factor: } expr '}' - { - LEX *lex= Lex; + { + LEX *lex= Lex; MYSQL_YYABORT_UNLESS($3 && $7); add_join_on($7,$10); Lex->pop_context(); @@ -7440,19 +7759,19 @@ table_factor: if (!($$= lex->current_select->nest_last_join(lex->thd))) MYSQL_YYABORT; } - | select_derived_init get_select_lex select_derived2 + | select_derived_init get_select_lex select_derived2 { LEX *lex= Lex; SELECT_LEX *sel= lex->current_select; if ($1) { - if (sel->set_braces(1)) - { + if (sel->set_braces(1)) + { my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } + MYSQL_YYABORT; + } /* select in braces, can't contain global parameters */ - if (sel->master_unit()->fake_select_lex) + if (sel->master_unit()->fake_select_lex) sel->master_unit()->global_parameters= sel->master_unit()->fake_select_lex; } @@ -7462,54 +7781,52 @@ table_factor: /* incomplete derived tables return NULL, we must be nested in select_derived rule to be here. */ } - | '(' get_select_lex select_derived union_opt ')' opt_table_alias - { - /* Use $2 instead of Lex->current_select as derived table will - alter value of Lex->current_select. */ - - if (!($3 || $6) && $2->embedding && - !$2->embedding->nested_join->join_list.elements) + | '(' get_select_lex select_derived union_opt ')' opt_table_alias { - /* we have a derived table ($3 == NULL) but no alias, - Since we are nested in further parentheses so we - can pass NULL to the outer level parentheses - Permits parsing of "((((select ...))) as xyz)" */ - $$= 0; - } - else - if (!$3) - { - /* Handle case of derived table, alias may be NULL if there - are no outer parentheses, add_table_to_list() will throw - error in this case */ - LEX *lex=Lex; - SELECT_LEX *sel= lex->current_select; - SELECT_LEX_UNIT *unit= sel->master_unit(); - lex->current_select= sel= unit->outer_select(); - if (!($$= sel-> - add_table_to_list(lex->thd, new Table_ident(unit), $6, 0, - TL_READ))) + /* Use $2 instead of Lex->current_select as derived table will + alter value of Lex->current_select. */ - MYSQL_YYABORT; - sel->add_joined_table($$); - lex->pop_context(); + if (!($3 || $6) && $2->embedding && + !$2->embedding->nested_join->join_list.elements) + { + /* we have a derived table ($3 == NULL) but no alias, + Since we are nested in further parentheses so we + can pass NULL to the outer level parentheses + Permits parsing of "((((select ...))) as xyz)" */ + $$= 0; + } + else if (!$3) + { + /* Handle case of derived table, alias may be NULL if there + are no outer parentheses, add_table_to_list() will throw + error in this case */ + LEX *lex=Lex; + SELECT_LEX *sel= lex->current_select; + SELECT_LEX_UNIT *unit= sel->master_unit(); + lex->current_select= sel= unit->outer_select(); + if (!($$= sel->add_table_to_list(lex->thd, + new Table_ident(unit), $6, 0, + TL_READ))) + + MYSQL_YYABORT; + sel->add_joined_table($$); + lex->pop_context(); + } + else if ($4 || $6) + { + /* simple nested joins cannot have aliases or unions */ + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + else + $$= $3; } - else - if ($4 || $6) - { - /* simple nested joins cannot have aliases or unions */ - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } - else - $$= $3; - } ; /* handle contents of parentheses in join expression */ select_derived: - get_select_lex - { + get_select_lex + { LEX *lex= Lex; if ($1->init_nested_join(lex->thd)) MYSQL_YYABORT; @@ -7525,37 +7842,37 @@ select_derived: if (!$3 && $$) { my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; + MYSQL_YYABORT; } } - ; + ; select_derived2: - { - LEX *lex= Lex; - lex->derived_tables|= DERIVED_SUBQUERY; - if (!lex->expr_allows_subselect || - lex->sql_command == (int)SQLCOM_PURGE) - { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } - if (lex->current_select->linkage == GLOBAL_OPTIONS_TYPE || - mysql_new_select(lex, 1)) - MYSQL_YYABORT; - mysql_init_select(lex); - lex->current_select->linkage= DERIVED_TABLE_TYPE; - lex->current_select->parsing_place= SELECT_LIST; - } - select_options select_item_list - { - Select->parsing_place= NO_MATTER; - } - opt_select_from + { + LEX *lex= Lex; + lex->derived_tables|= DERIVED_SUBQUERY; + if (!lex->expr_allows_subselect || + lex->sql_command == (int)SQLCOM_PURGE) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + if (lex->current_select->linkage == GLOBAL_OPTIONS_TYPE || + mysql_new_select(lex, 1)) + MYSQL_YYABORT; + mysql_init_select(lex); + lex->current_select->linkage= DERIVED_TABLE_TYPE; + lex->current_select->parsing_place= SELECT_LIST; + } + select_options select_item_list + { + Select->parsing_place= NO_MATTER; + } + opt_select_from ; get_select_lex: - /* Empty */ { $$= Select; } + /* Empty */ { $$= Select; } ; select_derived_init: @@ -7572,11 +7889,11 @@ select_derived_init: SELECT_LEX *sel= lex->current_select; TABLE_LIST *embedding; if (!sel->embedding || sel->end_nested_join(lex->thd)) - { + { /* we are not in parentheses */ my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } + MYSQL_YYABORT; + } embedding= Select->embedding; $$= embedding && !embedding->nested_join->join_list.elements; @@ -7585,226 +7902,231 @@ select_derived_init: ; opt_outer: - /* empty */ {} - | OUTER {}; + /* empty */ {} + | OUTER {} + ; index_hint_clause: - /* empty */ + /* empty */ { $$= global_system_variables.old_mode ? INDEX_HINT_MASK_JOIN : INDEX_HINT_MASK_ALL; - } - | FOR_SYM JOIN_SYM { $$= INDEX_HINT_MASK_JOIN; } - | FOR_SYM ORDER_SYM BY { $$= INDEX_HINT_MASK_ORDER; } - | FOR_SYM GROUP_SYM BY { $$= INDEX_HINT_MASK_GROUP; } - ; + } + | FOR_SYM JOIN_SYM { $$= INDEX_HINT_MASK_JOIN; } + | FOR_SYM ORDER_SYM BY { $$= INDEX_HINT_MASK_ORDER; } + | FOR_SYM GROUP_SYM BY { $$= INDEX_HINT_MASK_GROUP; } + ; index_hint_type: - FORCE_SYM { $$= INDEX_HINT_FORCE; } - | IGNORE_SYM { $$= INDEX_HINT_IGNORE; } - ; + FORCE_SYM { $$= INDEX_HINT_FORCE; } + | IGNORE_SYM { $$= INDEX_HINT_IGNORE; } + ; index_hint_definition: - index_hint_type key_or_index index_hint_clause + index_hint_type key_or_index index_hint_clause { - Select->set_index_hint_type($1, $3); - } - '(' key_usage_list ')' - | USE_SYM key_or_index index_hint_clause - { - Select->set_index_hint_type(INDEX_HINT_USE, $3); - } - '(' opt_key_usage_list ')' + Select->set_index_hint_type($1, $3); + } + '(' key_usage_list ')' + | USE_SYM key_or_index index_hint_clause + { + Select->set_index_hint_type(INDEX_HINT_USE, $3); + } + '(' opt_key_usage_list ')' ; index_hints_list: - index_hint_definition - | index_hints_list index_hint_definition - ; + index_hint_definition + | index_hints_list index_hint_definition + ; opt_index_hints_list: - /* empty */ - | { Select->alloc_index_hints(YYTHD); } index_hints_list - ; + /* empty */ + | { Select->alloc_index_hints(YYTHD); } index_hints_list + ; opt_key_definition: - { Select->clear_index_hints(); } - opt_index_hints_list - ; + { Select->clear_index_hints(); } + opt_index_hints_list + ; opt_key_usage_list: - /* empty */ { Select->add_index_hint(YYTHD, NULL, 0); } - | key_usage_list {} - ; + /* empty */ { Select->add_index_hint(YYTHD, NULL, 0); } + | key_usage_list {} + ; key_usage_element: - ident { Select->add_index_hint(YYTHD, $1.str, $1.length); } - | PRIMARY_SYM - { - Select->add_index_hint(YYTHD, (char *)"PRIMARY", 7); - } + ident + { Select->add_index_hint(YYTHD, $1.str, $1.length); } + | PRIMARY_SYM + { Select->add_index_hint(YYTHD, (char *)"PRIMARY", 7); } ; key_usage_list: - key_usage_element - | key_usage_list ',' key_usage_element + key_usage_element + | key_usage_list ',' key_usage_element ; using_list: - ident - { + ident + { if (!($$= new List)) - MYSQL_YYABORT; + MYSQL_YYABORT; $$->push_back(new (YYTHD->mem_root) String((const char *) $1.str, $1.length, system_charset_info)); - } - | using_list ',' ident - { + } + | using_list ',' ident + { $1->push_back(new (YYTHD->mem_root) String((const char *) $3.str, $3.length, system_charset_info)); $$= $1; - }; + } + ; interval: - interval_time_st {} - | DAY_HOUR_SYM { $$=INTERVAL_DAY_HOUR; } - | DAY_MICROSECOND_SYM { $$=INTERVAL_DAY_MICROSECOND; } - | DAY_MINUTE_SYM { $$=INTERVAL_DAY_MINUTE; } - | DAY_SECOND_SYM { $$=INTERVAL_DAY_SECOND; } - | HOUR_MICROSECOND_SYM { $$=INTERVAL_HOUR_MICROSECOND; } - | HOUR_MINUTE_SYM { $$=INTERVAL_HOUR_MINUTE; } - | HOUR_SECOND_SYM { $$=INTERVAL_HOUR_SECOND; } - | MICROSECOND_SYM { $$=INTERVAL_MICROSECOND; } - | MINUTE_MICROSECOND_SYM { $$=INTERVAL_MINUTE_MICROSECOND; } - | MINUTE_SECOND_SYM { $$=INTERVAL_MINUTE_SECOND; } - | SECOND_MICROSECOND_SYM { $$=INTERVAL_SECOND_MICROSECOND; } - | YEAR_MONTH_SYM { $$=INTERVAL_YEAR_MONTH; }; + interval_time_st {} + | DAY_HOUR_SYM { $$=INTERVAL_DAY_HOUR; } + | DAY_MICROSECOND_SYM { $$=INTERVAL_DAY_MICROSECOND; } + | DAY_MINUTE_SYM { $$=INTERVAL_DAY_MINUTE; } + | DAY_SECOND_SYM { $$=INTERVAL_DAY_SECOND; } + | HOUR_MICROSECOND_SYM { $$=INTERVAL_HOUR_MICROSECOND; } + | HOUR_MINUTE_SYM { $$=INTERVAL_HOUR_MINUTE; } + | HOUR_SECOND_SYM { $$=INTERVAL_HOUR_SECOND; } + | MICROSECOND_SYM { $$=INTERVAL_MICROSECOND; } + | MINUTE_MICROSECOND_SYM { $$=INTERVAL_MINUTE_MICROSECOND; } + | MINUTE_SECOND_SYM { $$=INTERVAL_MINUTE_SECOND; } + | SECOND_MICROSECOND_SYM { $$=INTERVAL_SECOND_MICROSECOND; } + | YEAR_MONTH_SYM { $$=INTERVAL_YEAR_MONTH; } + ; interval_time_st: - DAY_SYM { $$=INTERVAL_DAY; } - | WEEK_SYM { $$=INTERVAL_WEEK; } - | HOUR_SYM { $$=INTERVAL_HOUR; } - | FRAC_SECOND_SYM { $$=INTERVAL_MICROSECOND; } - | MINUTE_SYM { $$=INTERVAL_MINUTE; } - | MONTH_SYM { $$=INTERVAL_MONTH; } - | QUARTER_SYM { $$=INTERVAL_QUARTER; } - | SECOND_SYM { $$=INTERVAL_SECOND; } - | YEAR_SYM { $$=INTERVAL_YEAR; } + DAY_SYM { $$=INTERVAL_DAY; } + | WEEK_SYM { $$=INTERVAL_WEEK; } + | HOUR_SYM { $$=INTERVAL_HOUR; } + | FRAC_SECOND_SYM { $$=INTERVAL_MICROSECOND; } + | MINUTE_SYM { $$=INTERVAL_MINUTE; } + | MONTH_SYM { $$=INTERVAL_MONTH; } + | QUARTER_SYM { $$=INTERVAL_QUARTER; } + | SECOND_SYM { $$=INTERVAL_SECOND; } + | YEAR_SYM { $$=INTERVAL_YEAR; } ; date_time_type: - DATE_SYM {$$=MYSQL_TIMESTAMP_DATE;} - | TIME_SYM {$$=MYSQL_TIMESTAMP_TIME;} - | DATETIME {$$=MYSQL_TIMESTAMP_DATETIME;} - | TIMESTAMP {$$=MYSQL_TIMESTAMP_DATETIME;} + DATE_SYM {$$=MYSQL_TIMESTAMP_DATE;} + | TIME_SYM {$$=MYSQL_TIMESTAMP_TIME;} + | DATETIME {$$=MYSQL_TIMESTAMP_DATETIME;} + | TIMESTAMP {$$=MYSQL_TIMESTAMP_DATETIME;} ; table_alias: - /* empty */ - | AS - | EQ; + /* empty */ + | AS + | EQ + ; opt_table_alias: - /* empty */ { $$=0; } - | table_alias ident - { $$= (LEX_STRING*) sql_memdup(&$2,sizeof(LEX_STRING)); }; + /* empty */ { $$=0; } + | table_alias ident + { $$= (LEX_STRING*) sql_memdup(&$2,sizeof(LEX_STRING)); } + ; opt_all: - /* empty */ - | ALL - ; + /* empty */ + | ALL + ; where_clause: - /* empty */ { Select->where= 0; } - | WHERE + /* empty */ { Select->where= 0; } + | WHERE { Select->parsing_place= IN_WHERE; } expr - { + { SELECT_LEX *select= Select; - select->where= $3; + select->where= $3; select->parsing_place= NO_MATTER; - if ($3) - $3->top_level_item(); - } - ; + if ($3) + $3->top_level_item(); + } + ; having_clause: - /* empty */ - | HAVING - { - Select->parsing_place= IN_HAVING; + /* empty */ + | HAVING + { + Select->parsing_place= IN_HAVING; } - expr - { - SELECT_LEX *sel= Select; - sel->having= $3; - sel->parsing_place= NO_MATTER; - if ($3) - $3->top_level_item(); - } - ; + expr + { + SELECT_LEX *sel= Select; + sel->having= $3; + sel->parsing_place= NO_MATTER; + if ($3) + $3->top_level_item(); + } + ; opt_escape: - ESCAPE_SYM simple_expr + ESCAPE_SYM simple_expr { Lex->escape_used= TRUE; $$= $2; } - | /* empty */ + | /* empty */ { Lex->escape_used= FALSE; $$= ((YYTHD->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) ? - new Item_string("", 0, &my_charset_latin1) : + new Item_string("", 0, &my_charset_latin1) : new Item_string("\\", 1, &my_charset_latin1)); } ; - /* group by statement in select */ group_clause: - /* empty */ - | GROUP_SYM BY group_list olap_opt; + /* empty */ + | GROUP_SYM BY group_list olap_opt + ; group_list: - group_list ',' order_ident order_dir - { if (add_group_to_list(YYTHD, $3,(bool) $4)) MYSQL_YYABORT; } - | order_ident order_dir - { if (add_group_to_list(YYTHD, $1,(bool) $2)) MYSQL_YYABORT; }; + group_list ',' order_ident order_dir + { if (add_group_to_list(YYTHD, $3,(bool) $4)) MYSQL_YYABORT; } + | order_ident order_dir + { if (add_group_to_list(YYTHD, $1,(bool) $2)) MYSQL_YYABORT; } + ; olap_opt: - /* empty */ {} - | WITH CUBE_SYM + /* empty */ {} + | WITH CUBE_SYM { - LEX *lex=Lex; - if (lex->current_select->linkage == GLOBAL_OPTIONS_TYPE) - { - my_error(ER_WRONG_USAGE, MYF(0), "WITH CUBE", - "global union parameters"); - MYSQL_YYABORT; - } - lex->current_select->olap= CUBE_TYPE; - my_error(ER_NOT_SUPPORTED_YET, MYF(0), "CUBE"); - MYSQL_YYABORT; /* To be deleted in 5.1 */ - } - | WITH ROLLUP_SYM + LEX *lex=Lex; + if (lex->current_select->linkage == GLOBAL_OPTIONS_TYPE) + { + my_error(ER_WRONG_USAGE, MYF(0), "WITH CUBE", + "global union parameters"); + MYSQL_YYABORT; + } + lex->current_select->olap= CUBE_TYPE; + my_error(ER_NOT_SUPPORTED_YET, MYF(0), "CUBE"); + MYSQL_YYABORT; /* To be deleted in 5.1 */ + } + | WITH ROLLUP_SYM { - LEX *lex= Lex; - if (lex->current_select->linkage == GLOBAL_OPTIONS_TYPE) - { - my_error(ER_WRONG_USAGE, MYF(0), "WITH ROLLUP", - "global union parameters"); - MYSQL_YYABORT; - } - lex->current_select->olap= ROLLUP_TYPE; - } - ; + LEX *lex= Lex; + if (lex->current_select->linkage == GLOBAL_OPTIONS_TYPE) + { + my_error(ER_WRONG_USAGE, MYF(0), "WITH ROLLUP", + "global union parameters"); + MYSQL_YYABORT; + } + lex->current_select->olap= ROLLUP_TYPE; + } + ; /* Order by statement in ALTER TABLE @@ -7834,166 +8156,172 @@ alter_order_item: */ opt_order_clause: - /* empty */ - | order_clause; + /* empty */ + | order_clause + ; order_clause: - ORDER_SYM BY - { - LEX *lex=Lex; - SELECT_LEX *sel= lex->current_select; - SELECT_LEX_UNIT *unit= sel-> master_unit(); - if (sel->linkage != GLOBAL_OPTIONS_TYPE && - sel->olap != UNSPECIFIED_OLAP_TYPE) - { - my_error(ER_WRONG_USAGE, MYF(0), - "CUBE/ROLLUP", "ORDER BY"); - MYSQL_YYABORT; - } - if (lex->sql_command != SQLCOM_ALTER_TABLE && !unit->fake_select_lex) + ORDER_SYM BY { - /* - A query of the of the form (SELECT ...) ORDER BY order_list is - executed in the same way as the query - SELECT ... ORDER BY order_list - unless the SELECT construct contains ORDER BY or LIMIT clauses. - Otherwise we create a fake SELECT_LEX if it has not been created - yet. - */ - SELECT_LEX *first_sl= unit->first_select(); - if (!unit->is_union() && - (first_sl->order_list.elements || - first_sl->select_limit) && - unit->add_fake_select_lex(lex->thd)) + LEX *lex=Lex; + SELECT_LEX *sel= lex->current_select; + SELECT_LEX_UNIT *unit= sel-> master_unit(); + if (sel->linkage != GLOBAL_OPTIONS_TYPE && + sel->olap != UNSPECIFIED_OLAP_TYPE) + { + my_error(ER_WRONG_USAGE, MYF(0), + "CUBE/ROLLUP", "ORDER BY"); MYSQL_YYABORT; + } + if (lex->sql_command != SQLCOM_ALTER_TABLE && !unit->fake_select_lex) + { + /* + A query of the of the form (SELECT ...) ORDER BY order_list is + executed in the same way as the query + SELECT ... ORDER BY order_list + unless the SELECT construct contains ORDER BY or LIMIT clauses. + Otherwise we create a fake SELECT_LEX if it has not been created + yet. + */ + SELECT_LEX *first_sl= unit->first_select(); + if (!unit->is_union() && + (first_sl->order_list.elements || + first_sl->select_limit) && + unit->add_fake_select_lex(lex->thd)) + MYSQL_YYABORT; + } } - } order_list; + order_list + ; order_list: - order_list ',' order_ident order_dir - { if (add_order_to_list(YYTHD, $3,(bool) $4)) MYSQL_YYABORT; } - | order_ident order_dir - { if (add_order_to_list(YYTHD, $1,(bool) $2)) MYSQL_YYABORT; }; + order_list ',' order_ident order_dir + { if (add_order_to_list(YYTHD, $3,(bool) $4)) MYSQL_YYABORT; } + | order_ident order_dir + { if (add_order_to_list(YYTHD, $1,(bool) $2)) MYSQL_YYABORT; } + ; order_dir: - /* empty */ { $$ = 1; } - | ASC { $$ =1; } - | DESC { $$ =0; }; - + /* empty */ { $$ = 1; } + | ASC { $$ =1; } + | DESC { $$ =0; } + ; opt_limit_clause_init: - /* empty */ - { - LEX *lex= Lex; - SELECT_LEX *sel= lex->current_select; - sel->offset_limit= 0; - sel->select_limit= 0; - } - | limit_clause {} - ; + /* empty */ + { + LEX *lex= Lex; + SELECT_LEX *sel= lex->current_select; + sel->offset_limit= 0; + sel->select_limit= 0; + } + | limit_clause {} + ; opt_limit_clause: - /* empty */ {} - | limit_clause {} - ; + /* empty */ {} + | limit_clause {} + ; limit_clause: - LIMIT limit_options {} - ; + LIMIT limit_options {} + ; limit_options: - limit_option - { + limit_option + { SELECT_LEX *sel= Select; sel->select_limit= $1; sel->offset_limit= 0; - sel->explicit_limit= 1; - } - | limit_option ',' limit_option - { - SELECT_LEX *sel= Select; - sel->select_limit= $3; - sel->offset_limit= $1; - sel->explicit_limit= 1; - } - | limit_option OFFSET_SYM limit_option - { - SELECT_LEX *sel= Select; - sel->select_limit= $1; - sel->offset_limit= $3; - sel->explicit_limit= 1; - } - ; + sel->explicit_limit= 1; + } + | limit_option ',' limit_option + { + SELECT_LEX *sel= Select; + sel->select_limit= $3; + sel->offset_limit= $1; + sel->explicit_limit= 1; + } + | limit_option OFFSET_SYM limit_option + { + SELECT_LEX *sel= Select; + sel->select_limit= $1; + sel->offset_limit= $3; + sel->explicit_limit= 1; + } + ; + limit_option: - param_marker - { - ((Item_param *) $1)->set_strict_type(INT_RESULT); - } + param_marker + { + ((Item_param *) $1)->set_strict_type(INT_RESULT); + } | ULONGLONG_NUM { $$= new Item_uint($1.str, $1.length); } - | LONG_NUM { $$= new Item_uint($1.str, $1.length); } + | LONG_NUM { $$= new Item_uint($1.str, $1.length); } | NUM { $$= new Item_uint($1.str, $1.length); } ; delete_limit_clause: - /* empty */ - { - LEX *lex=Lex; - lex->current_select->select_limit= 0; - } - | LIMIT limit_option - { - SELECT_LEX *sel= Select; - sel->select_limit= $2; - sel->explicit_limit= 1; - }; + /* empty */ + { + LEX *lex=Lex; + lex->current_select->select_limit= 0; + } + | LIMIT limit_option + { + SELECT_LEX *sel= Select; + sel->select_limit= $2; + sel->explicit_limit= 1; + } + ; ulong_num: NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } - | HEX_NUM { $$= (ulong) strtol($1.str, (char**) 0, 16); } - | LONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } - | ULONGLONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } + | HEX_NUM { $$= (ulong) strtol($1.str, (char**) 0, 16); } + | LONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } + | ULONGLONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } | DECIMAL_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } - | FLOAT_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } + | FLOAT_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } ; real_ulong_num: NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } - | HEX_NUM { $$= (ulong) strtol($1.str, (char**) 0, 16); } - | LONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } - | ULONGLONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } + | HEX_NUM { $$= (ulong) strtol($1.str, (char**) 0, 16); } + | LONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } + | ULONGLONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } | dec_num_error { MYSQL_YYABORT; } ; ulonglong_num: - NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } - | ULONGLONG_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } - | LONG_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } - | DECIMAL_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } - | FLOAT_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } - ; + NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } + | ULONGLONG_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } + | LONG_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } + | DECIMAL_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } + | FLOAT_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } + ; real_ulonglong_num: - NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } - | ULONGLONG_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } - | LONG_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } + NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } + | ULONGLONG_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } + | LONG_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } | dec_num_error { MYSQL_YYABORT; } ; dec_num_error: - dec_num - { my_parse_error(ER(ER_ONLY_INTEGERS_ALLOWED)); } + dec_num + { my_parse_error(ER(ER_ONLY_INTEGERS_ALLOWED)); } ; dec_num: - DECIMAL_NUM - | FLOAT_NUM + DECIMAL_NUM + | FLOAT_NUM ; procedure_clause: - /* empty */ - | PROCEDURE ident /* Procedure name */ - { - LEX *lex=Lex; + /* empty */ + | PROCEDURE ident /* Procedure name */ + { + LEX *lex=Lex; if (! lex->parsing_options.allows_select_procedure) { @@ -8001,225 +8329,227 @@ procedure_clause: MYSQL_YYABORT; } - if (&lex->select_lex != lex->current_select) - { - my_error(ER_WRONG_USAGE, MYF(0), "PROCEDURE", "subquery"); - MYSQL_YYABORT; - } - lex->proc_list.elements=0; - lex->proc_list.first=0; - lex->proc_list.next= (uchar**) &lex->proc_list.first; - if (add_proc_to_list(lex->thd, new Item_field(&lex-> + if (&lex->select_lex != lex->current_select) + { + my_error(ER_WRONG_USAGE, MYF(0), "PROCEDURE", "subquery"); + MYSQL_YYABORT; + } + lex->proc_list.elements=0; + lex->proc_list.first=0; + lex->proc_list.next= (uchar**) &lex->proc_list.first; + if (add_proc_to_list(lex->thd, new Item_field(&lex-> current_select-> context, NULL,NULL,$2.str))) - MYSQL_YYABORT; - Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); - } - '(' procedure_list ')'; - + MYSQL_YYABORT; + Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + } + '(' procedure_list ')' + ; procedure_list: - /* empty */ {} - | procedure_list2 {}; + /* empty */ {} + | procedure_list2 {} + ; procedure_list2: - procedure_list2 ',' procedure_item - | procedure_item; + procedure_list2 ',' procedure_item + | procedure_item + ; procedure_item: - remember_name expr remember_end - { + remember_name expr remember_end + { THD *thd= YYTHD; - if (add_proc_to_list(thd, $2)) - MYSQL_YYABORT; - if (!$2->name) + if (add_proc_to_list(thd, $2)) + MYSQL_YYABORT; + if (!$2->name) $2->set_name($1, (uint) ($3 - $1), thd->charset()); - } - ; - + } + ; select_var_list_init: - { - LEX *lex=Lex; - if (!lex->describe && (!(lex->result= new select_dumpvar()))) - MYSQL_YYABORT; - } - select_var_list - {} - ; + { + LEX *lex=Lex; + if (!lex->describe && (!(lex->result= new select_dumpvar()))) + MYSQL_YYABORT; + } + select_var_list + {} + ; select_var_list: - select_var_list ',' select_var_ident - | select_var_ident {} - ; + select_var_list ',' select_var_ident + | select_var_ident {} + ; select_var_ident: - '@' ident_or_text - { - LEX *lex=Lex; - if (lex->result) - ((select_dumpvar *)lex->result)->var_list.push_back( new my_var($2,0,0,(enum_field_types)0)); - else - /* - The parser won't create select_result instance only - if it's an EXPLAIN. - */ - DBUG_ASSERT(lex->describe); - } - | ident_or_text - { - LEX *lex=Lex; - sp_variable_t *t; + '@' ident_or_text + { + LEX *lex=Lex; + if (lex->result) + ((select_dumpvar *)lex->result)->var_list.push_back( new my_var($2,0,0,(enum_field_types)0)); + else + /* + The parser won't create select_result instance only + if it's an EXPLAIN. + */ + DBUG_ASSERT(lex->describe); + } + | ident_or_text + { + LEX *lex=Lex; + sp_variable_t *t; - if (!lex->spcont || !(t=lex->spcont->find_variable(&$1))) - { - my_error(ER_SP_UNDECLARED_VAR, MYF(0), $1.str); - MYSQL_YYABORT; - } - if (lex->result) - { - my_var *var; - ((select_dumpvar *)lex->result)-> - var_list.push_back(var= new my_var($1,1,t->offset,t->type)); + if (!lex->spcont || !(t=lex->spcont->find_variable(&$1))) + { + my_error(ER_SP_UNDECLARED_VAR, MYF(0), $1.str); + MYSQL_YYABORT; + } + if (lex->result) + { + my_var *var; + ((select_dumpvar *)lex->result)-> + var_list.push_back(var= new my_var($1,1,t->offset,t->type)); #ifndef DBUG_OFF - if (var) - var->sp= lex->sphead; + if (var) + var->sp= lex->sphead; #endif - } - else - { - /* - The parser won't create select_result instance only - if it's an EXPLAIN. - */ - DBUG_ASSERT(lex->describe); - } - } - ; + } + else + { + /* + The parser won't create select_result instance only + if it's an EXPLAIN. + */ + DBUG_ASSERT(lex->describe); + } + } + ; into: - INTO - { - if (! Lex->parsing_options.allows_select_into) + INTO { - my_error(ER_VIEW_SELECT_CLAUSE, MYF(0), "INTO"); - MYSQL_YYABORT; + if (! Lex->parsing_options.allows_select_into) + { + my_error(ER_VIEW_SELECT_CLAUSE, MYF(0), "INTO"); + MYSQL_YYABORT; + } } - } - into_destination + into_destination ; into_destination: - OUTFILE TEXT_STRING_filesystem - { - LEX *lex= Lex; - lex->uncacheable(UNCACHEABLE_SIDEEFFECT); - if (!(lex->exchange= new sql_exchange($2.str, 0)) || - !(lex->result= new select_export(lex->exchange))) - MYSQL_YYABORT; - } - opt_field_term opt_line_term - | DUMPFILE TEXT_STRING_filesystem - { - LEX *lex=Lex; - if (!lex->describe) - { - lex->uncacheable(UNCACHEABLE_SIDEEFFECT); - if (!(lex->exchange= new sql_exchange($2.str,1))) - MYSQL_YYABORT; - if (!(lex->result= new select_dump(lex->exchange))) - MYSQL_YYABORT; - } - } + OUTFILE TEXT_STRING_filesystem + { + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + if (!(lex->exchange= new sql_exchange($2.str, 0)) || + !(lex->result= new select_export(lex->exchange))) + MYSQL_YYABORT; + } + opt_field_term opt_line_term + | DUMPFILE TEXT_STRING_filesystem + { + LEX *lex=Lex; + if (!lex->describe) + { + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + if (!(lex->exchange= new sql_exchange($2.str,1))) + MYSQL_YYABORT; + if (!(lex->result= new select_dump(lex->exchange))) + MYSQL_YYABORT; + } + } | select_var_list_init - { - Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); - } + { + Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + } ; /* DO statement */ -do: DO_SYM - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_DO; - mysql_init_select(lex); - } - expr_list - { - Lex->insert_list= $3; - } - ; +do: + DO_SYM + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_DO; + mysql_init_select(lex); + } + expr_list + { + Lex->insert_list= $3; + } + ; /* Drop : delete tables or index or user */ drop: - DROP opt_temporary table_or_tables if_exists table_list opt_restrict - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_DROP_TABLE; - lex->drop_temporary= $2; - lex->drop_if_exists= $4; - } - | DROP INDEX_SYM ident ON table_ident {} - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_DROP_INDEX; - lex->alter_info.reset(); - lex->alter_info.flags= ALTER_DROP_INDEX; - lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::KEY, - $3.str)); - if (!lex->current_select->add_table_to_list(lex->thd, $5, NULL, - TL_OPTION_UPDATING)) - MYSQL_YYABORT; - } - | DROP DATABASE if_exists ident - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_DROP_DB; - lex->drop_if_exists=$3; - lex->name= $4; - } - | DROP FUNCTION_SYM if_exists sp_name - { - LEX *lex=Lex; - if (lex->sphead) - { - my_error(ER_SP_NO_DROP_SP, MYF(0), "FUNCTION"); - MYSQL_YYABORT; - } - lex->sql_command = SQLCOM_DROP_FUNCTION; - lex->drop_if_exists= $3; - lex->spname= $4; - } - | DROP PROCEDURE if_exists sp_name - { - LEX *lex=Lex; - if (lex->sphead) - { - my_error(ER_SP_NO_DROP_SP, MYF(0), "PROCEDURE"); - MYSQL_YYABORT; - } - lex->sql_command = SQLCOM_DROP_PROCEDURE; - lex->drop_if_exists= $3; - lex->spname= $4; - } - | DROP USER clear_privileges user_list - { - Lex->sql_command = SQLCOM_DROP_USER; + DROP opt_temporary table_or_tables if_exists table_list opt_restrict + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_DROP_TABLE; + lex->drop_temporary= $2; + lex->drop_if_exists= $4; + } + | DROP INDEX_SYM ident ON table_ident {} + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_DROP_INDEX; + lex->alter_info.reset(); + lex->alter_info.flags= ALTER_DROP_INDEX; + lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::KEY, + $3.str)); + if (!lex->current_select->add_table_to_list(lex->thd, $5, NULL, + TL_OPTION_UPDATING)) + MYSQL_YYABORT; + } + | DROP DATABASE if_exists ident + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_DROP_DB; + lex->drop_if_exists=$3; + lex->name= $4; + } + | DROP FUNCTION_SYM if_exists sp_name + { + LEX *lex=Lex; + if (lex->sphead) + { + my_error(ER_SP_NO_DROP_SP, MYF(0), "FUNCTION"); + MYSQL_YYABORT; + } + lex->sql_command = SQLCOM_DROP_FUNCTION; + lex->drop_if_exists= $3; + lex->spname= $4; + } + | DROP PROCEDURE if_exists sp_name + { + LEX *lex=Lex; + if (lex->sphead) + { + my_error(ER_SP_NO_DROP_SP, MYF(0), "PROCEDURE"); + MYSQL_YYABORT; + } + lex->sql_command = SQLCOM_DROP_PROCEDURE; + lex->drop_if_exists= $3; + lex->spname= $4; + } + | DROP USER clear_privileges user_list + { + Lex->sql_command = SQLCOM_DROP_USER; + } + | DROP VIEW_SYM if_exists table_list opt_restrict + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_DROP_VIEW; + lex->drop_if_exists= $3; } - | DROP VIEW_SYM if_exists table_list opt_restrict - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_DROP_VIEW; - lex->drop_if_exists= $3; - } | DROP EVENT_SYM if_exists sp_name { Lex->drop_if_exists= $3; @@ -8232,7 +8562,7 @@ drop: lex->sql_command= SQLCOM_DROP_TRIGGER; lex->drop_if_exists= $3; lex->spname= $4; - } + } | DROP TABLESPACE tablespace_name opt_ts_engine opt_ts_wait { LEX *lex= Lex; @@ -8242,79 +8572,81 @@ drop: { LEX *lex= Lex; lex->alter_tablespace_info->ts_cmd_type= DROP_LOGFILE_GROUP; - } + } | DROP SERVER_SYM if_exists ident_or_text - { - Lex->sql_command = SQLCOM_DROP_SERVER; - Lex->drop_if_exists= $3; - Lex->server_options.server_name= $4.str; - Lex->server_options.server_name_length= $4.length; - } - ; + { + Lex->sql_command = SQLCOM_DROP_SERVER; + Lex->drop_if_exists= $3; + Lex->server_options.server_name= $4.str; + Lex->server_options.server_name_length= $4.length; + } + ; table_list: - table_name - | table_list ',' table_name; + table_name + | table_list ',' table_name + ; table_name: - table_ident - { - if (!Select->add_table_to_list(YYTHD, $1, NULL, TL_OPTION_UPDATING)) - MYSQL_YYABORT; - } - ; + table_ident + { + if (!Select->add_table_to_list(YYTHD, $1, NULL, TL_OPTION_UPDATING)) + MYSQL_YYABORT; + } + ; if_exists: - /* empty */ { $$= 0; } - | IF EXISTS { $$= 1; } - ; + /* empty */ { $$= 0; } + | IF EXISTS { $$= 1; } + ; opt_temporary: - /* empty */ { $$= 0; } - | TEMPORARY { $$= 1; } - ; + /* empty */ { $$= 0; } + | TEMPORARY { $$= 1; } + ; /* ** Insert : add new data to table */ insert: - INSERT - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_INSERT; - lex->duplicates= DUP_ERROR; - mysql_init_select(lex); - /* for subselects */ - lex->lock_option= (using_update_log) ? TL_READ_NO_INSERT : TL_READ; - } insert_lock_option - opt_ignore insert2 - { - Select->set_lock_for_tables($3); - Lex->current_select= &Lex->select_lex; - } - insert_field_spec opt_insert_update - {} - ; + INSERT + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_INSERT; + lex->duplicates= DUP_ERROR; + mysql_init_select(lex); + /* for subselects */ + lex->lock_option= (using_update_log) ? TL_READ_NO_INSERT : TL_READ; + } + insert_lock_option + opt_ignore insert2 + { + Select->set_lock_for_tables($3); + Lex->current_select= &Lex->select_lex; + } + insert_field_spec opt_insert_update + {} + ; replace: - REPLACE - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_REPLACE; - lex->duplicates= DUP_REPLACE; - mysql_init_select(lex); - } - replace_lock_option insert2 - { - Select->set_lock_for_tables($3); - Lex->current_select= &Lex->select_lex; - } - insert_field_spec - {} - ; + REPLACE + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_REPLACE; + lex->duplicates= DUP_REPLACE; + mysql_init_select(lex); + } + replace_lock_option insert2 + { + Select->set_lock_for_tables($3); + Lex->current_select= &Lex->select_lex; + } + insert_field_spec + {} + ; insert_lock_option: - /* empty */ + /* empty */ { #ifdef HAVE_QUERY_CACHE /* @@ -8327,298 +8659,321 @@ insert_lock_option: $$= TL_WRITE_CONCURRENT_INSERT; #endif } - | LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; } - | DELAYED_SYM { $$= TL_WRITE_DELAYED; } - | HIGH_PRIORITY { $$= TL_WRITE; } - ; + | LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; } + | DELAYED_SYM { $$= TL_WRITE_DELAYED; } + | HIGH_PRIORITY { $$= TL_WRITE; } + ; replace_lock_option: - opt_low_priority { $$= $1; } - | DELAYED_SYM { $$= TL_WRITE_DELAYED; }; + opt_low_priority { $$= $1; } + | DELAYED_SYM { $$= TL_WRITE_DELAYED; } + ; insert2: - INTO insert_table {} - | insert_table {}; + INTO insert_table {} + | insert_table {} + ; insert_table: - table_name - { - LEX *lex=Lex; - lex->field_list.empty(); - lex->many_values.empty(); - lex->insert_list=0; - }; + table_name + { + LEX *lex=Lex; + lex->field_list.empty(); + lex->many_values.empty(); + lex->insert_list=0; + }; insert_field_spec: - insert_values {} - | '(' ')' insert_values {} - | '(' fields ')' insert_values {} - | SET - { - LEX *lex=Lex; - if (!(lex->insert_list = new List_item) || - lex->many_values.push_back(lex->insert_list)) - MYSQL_YYABORT; - } - ident_eq_list; + insert_values {} + | '(' ')' insert_values {} + | '(' fields ')' insert_values {} + | SET + { + LEX *lex=Lex; + if (!(lex->insert_list = new List_item) || + lex->many_values.push_back(lex->insert_list)) + MYSQL_YYABORT; + } + ident_eq_list + ; fields: - fields ',' insert_ident { Lex->field_list.push_back($3); } - | insert_ident { Lex->field_list.push_back($1); }; + fields ',' insert_ident { Lex->field_list.push_back($3); } + | insert_ident { Lex->field_list.push_back($1); } + ; insert_values: - VALUES values_list {} - | VALUE_SYM values_list {} - | create_select { Select->set_braces(0);} union_clause {} - | '(' create_select ')' { Select->set_braces(1);} union_opt {} + VALUES values_list {} + | VALUE_SYM values_list {} + | create_select + { Select->set_braces(0);} + union_clause {} + | '(' create_select ')' + { Select->set_braces(1);} + union_opt {} ; values_list: - values_list ',' no_braces - | no_braces; + values_list ',' no_braces + | no_braces + ; ident_eq_list: - ident_eq_list ',' ident_eq_value - | - ident_eq_value; + ident_eq_list ',' ident_eq_value + | ident_eq_value + ; ident_eq_value: - simple_ident_nospvar equal expr_or_default - { - LEX *lex=Lex; - if (lex->field_list.push_back($1) || - lex->insert_list->push_back($3)) - MYSQL_YYABORT; - }; + simple_ident_nospvar equal expr_or_default + { + LEX *lex=Lex; + if (lex->field_list.push_back($1) || + lex->insert_list->push_back($3)) + MYSQL_YYABORT; + } + ; -equal: EQ {} - | SET_VAR {} - ; +equal: + EQ {} + | SET_VAR {} + ; opt_equal: - /* empty */ {} - | equal {} - ; + /* empty */ {} + | equal {} + ; no_braces: - '(' - { - if (!(Lex->insert_list = new List_item)) - MYSQL_YYABORT; - } - opt_values ')' - { - LEX *lex=Lex; - if (lex->many_values.push_back(lex->insert_list)) - MYSQL_YYABORT; - }; + '(' + { + if (!(Lex->insert_list = new List_item)) + MYSQL_YYABORT; + } + opt_values ')' + { + LEX *lex=Lex; + if (lex->many_values.push_back(lex->insert_list)) + MYSQL_YYABORT; + } + ; opt_values: - /* empty */ {} - | values; + /* empty */ {} + | values + ; values: - values ',' expr_or_default - { - if (Lex->insert_list->push_back($3)) - MYSQL_YYABORT; - } - | expr_or_default - { - if (Lex->insert_list->push_back($1)) - MYSQL_YYABORT; - } - ; + values ',' expr_or_default + { + if (Lex->insert_list->push_back($3)) + MYSQL_YYABORT; + } + | expr_or_default + { + if (Lex->insert_list->push_back($1)) + MYSQL_YYABORT; + } + ; expr_or_default: - expr { $$= $1;} - | DEFAULT {$$= new Item_default_value(Lex->current_context()); } - ; + expr { $$= $1;} + | DEFAULT {$$= new Item_default_value(Lex->current_context()); } + ; opt_insert_update: - /* empty */ - | ON DUPLICATE_SYM { Lex->duplicates= DUP_UPDATE; } + /* empty */ + | ON DUPLICATE_SYM { Lex->duplicates= DUP_UPDATE; } KEY_SYM UPDATE_SYM insert_update_list ; /* Update rows in a table */ update: - UPDATE_SYM - { - LEX *lex= Lex; - mysql_init_select(lex); - lex->sql_command= SQLCOM_UPDATE; - lex->lock_option= TL_UNLOCK; /* Will be set later */ - lex->duplicates= DUP_ERROR; - } - opt_low_priority opt_ignore join_table_list - SET update_list - { - LEX *lex= Lex; - if (lex->select_lex.table_list.elements > 1) - lex->sql_command= SQLCOM_UPDATE_MULTI; - else if (lex->select_lex.get_table_list()->derived) - { - /* it is single table update and it is update of derived table */ - my_error(ER_NON_UPDATABLE_TABLE, MYF(0), - lex->select_lex.get_table_list()->alias, "UPDATE"); - MYSQL_YYABORT; - } - /* - In case of multi-update setting write lock for all tables may - be too pessimistic. We will decrease lock level if possible in - mysql_multi_update(). - */ - Select->set_lock_for_tables($3); - } - where_clause opt_order_clause delete_limit_clause {} - ; + UPDATE_SYM + { + LEX *lex= Lex; + mysql_init_select(lex); + lex->sql_command= SQLCOM_UPDATE; + lex->lock_option= TL_UNLOCK; /* Will be set later */ + lex->duplicates= DUP_ERROR; + } + opt_low_priority opt_ignore join_table_list + SET update_list + { + LEX *lex= Lex; + if (lex->select_lex.table_list.elements > 1) + lex->sql_command= SQLCOM_UPDATE_MULTI; + else if (lex->select_lex.get_table_list()->derived) + { + /* it is single table update and it is update of derived table */ + my_error(ER_NON_UPDATABLE_TABLE, MYF(0), + lex->select_lex.get_table_list()->alias, "UPDATE"); + MYSQL_YYABORT; + } + /* + In case of multi-update setting write lock for all tables may + be too pessimistic. We will decrease lock level if possible in + mysql_multi_update(). + */ + Select->set_lock_for_tables($3); + } + where_clause opt_order_clause delete_limit_clause {} + ; update_list: - update_list ',' update_elem - | update_elem; + update_list ',' update_elem + | update_elem + ; update_elem: - simple_ident_nospvar equal expr_or_default - { - if (add_item_to_list(YYTHD, $1) || add_value_to_list(YYTHD, $3)) - MYSQL_YYABORT; - }; + simple_ident_nospvar equal expr_or_default + { + if (add_item_to_list(YYTHD, $1) || add_value_to_list(YYTHD, $3)) + MYSQL_YYABORT; + } + ; insert_update_list: - insert_update_list ',' insert_update_elem - | insert_update_elem; + insert_update_list ',' insert_update_elem + | insert_update_elem + ; insert_update_elem: - simple_ident_nospvar equal expr_or_default - { - LEX *lex= Lex; - if (lex->update_list.push_back($1) || - lex->value_list.push_back($3)) - MYSQL_YYABORT; - }; + simple_ident_nospvar equal expr_or_default + { + LEX *lex= Lex; + if (lex->update_list.push_back($1) || + lex->value_list.push_back($3)) + MYSQL_YYABORT; + } + ; opt_low_priority: - /* empty */ { $$= TL_WRITE_DEFAULT; } - | LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; }; + /* empty */ { $$= TL_WRITE_DEFAULT; } + | LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; } + ; /* Delete rows from a table */ delete: - DELETE_SYM - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_DELETE; - mysql_init_select(lex); - lex->lock_option= TL_WRITE_DEFAULT; - lex->ignore= 0; - lex->select_lex.init_order(); - } - opt_delete_options single_multi {} - ; + DELETE_SYM + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_DELETE; + mysql_init_select(lex); + lex->lock_option= TL_WRITE_DEFAULT; + lex->ignore= 0; + lex->select_lex.init_order(); + } + opt_delete_options single_multi {} + ; single_multi: - FROM table_ident - { - if (!Select->add_table_to_list(YYTHD, $2, NULL, TL_OPTION_UPDATING, - Lex->lock_option)) - MYSQL_YYABORT; - } - where_clause opt_order_clause - delete_limit_clause {} - | table_wild_list - { mysql_init_multi_delete(Lex); } + FROM table_ident + { + if (!Select->add_table_to_list(YYTHD, $2, NULL, TL_OPTION_UPDATING, + Lex->lock_option)) + MYSQL_YYABORT; + } + where_clause opt_order_clause + delete_limit_clause {} + | table_wild_list + { mysql_init_multi_delete(Lex); } FROM join_table_list where_clause { if (multi_delete_set_locks_and_link_aux_tables(Lex)) MYSQL_YYABORT; } - | FROM table_wild_list - { mysql_init_multi_delete(Lex); } - USING join_table_list where_clause + | FROM table_wild_list + { mysql_init_multi_delete(Lex); } + USING join_table_list where_clause { if (multi_delete_set_locks_and_link_aux_tables(Lex)) MYSQL_YYABORT; } - ; + ; table_wild_list: - table_wild_one {} - | table_wild_list ',' table_wild_one {}; + table_wild_one {} + | table_wild_list ',' table_wild_one {} + ; table_wild_one: - ident opt_wild opt_table_alias - { - if (!Select->add_table_to_list(YYTHD, new Table_ident($1), $3, - TL_OPTION_UPDATING | - TL_OPTION_ALIAS, Lex->lock_option)) - MYSQL_YYABORT; - } - | ident '.' ident opt_wild opt_table_alias - { - if (!Select->add_table_to_list(YYTHD, - new Table_ident(YYTHD, $1, $3, 0), - $5, - TL_OPTION_UPDATING | - TL_OPTION_ALIAS, - Lex->lock_option)) - MYSQL_YYABORT; - } - ; + ident opt_wild opt_table_alias + { + if (!Select->add_table_to_list(YYTHD, new Table_ident($1), + $3, + TL_OPTION_UPDATING | TL_OPTION_ALIAS, + Lex->lock_option)) + MYSQL_YYABORT; + } + | ident '.' ident opt_wild opt_table_alias + { + if (!Select->add_table_to_list(YYTHD, + new Table_ident(YYTHD, $1, $3, 0), + $5, + TL_OPTION_UPDATING | TL_OPTION_ALIAS, + Lex->lock_option)) + MYSQL_YYABORT; + } + ; opt_wild: - /* empty */ {} - | '.' '*' {}; - + /* empty */ {} + | '.' '*' {} + ; opt_delete_options: - /* empty */ {} - | opt_delete_option opt_delete_options {}; + /* empty */ {} + | opt_delete_option opt_delete_options {} + ; opt_delete_option: - QUICK { Select->options|= OPTION_QUICK; } - | LOW_PRIORITY { Lex->lock_option= TL_WRITE_LOW_PRIORITY; } - | IGNORE_SYM { Lex->ignore= 1; }; + QUICK { Select->options|= OPTION_QUICK; } + | LOW_PRIORITY { Lex->lock_option= TL_WRITE_LOW_PRIORITY; } + | IGNORE_SYM { Lex->ignore= 1; } + ; truncate: - TRUNCATE_SYM opt_table_sym table_name - { - LEX* lex= Lex; - lex->sql_command= SQLCOM_TRUNCATE; - lex->select_lex.options= 0; - lex->select_lex.sql_cache= SELECT_LEX::SQL_CACHE_UNSPECIFIED; - lex->select_lex.init_order(); - } - ; + TRUNCATE_SYM opt_table_sym table_name + { + LEX* lex= Lex; + lex->sql_command= SQLCOM_TRUNCATE; + lex->select_lex.options= 0; + lex->select_lex.sql_cache= SELECT_LEX::SQL_CACHE_UNSPECIFIED; + lex->select_lex.init_order(); + } + ; opt_table_sym: - /* empty */ - | TABLE_SYM; + /* empty */ + | TABLE_SYM + ; /* Show things */ -show: SHOW - { - LEX *lex=Lex; - lex->wild=0; - lex->lock_option= TL_READ; - mysql_init_select(lex); - lex->current_select->parsing_place= SELECT_LIST; - bzero((char*) &lex->create_info,sizeof(lex->create_info)); - } - show_param - {} - ; +show: + SHOW + { + LEX *lex=Lex; + lex->wild=0; + lex->lock_option= TL_READ; + mysql_init_select(lex); + lex->current_select->parsing_place= SELECT_LIST; + bzero((char*) &lex->create_info,sizeof(lex->create_info)); + } + show_param + {} + ; show_param: - DATABASES wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_DATABASES; - if (prepare_schema_table(YYTHD, lex, 0, SCH_SCHEMATA)) - MYSQL_YYABORT; - } + DATABASES wild_and_where + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_DATABASES; + if (prepare_schema_table(YYTHD, lex, 0, SCH_SCHEMATA)) + MYSQL_YYABORT; + } | opt_full TABLES opt_db wild_and_where { LEX *lex= Lex; @@ -8652,112 +9007,115 @@ show_param: MYSQL_YYABORT; } | OPEN_SYM TABLES opt_db wild_and_where - { - LEX *lex= Lex; + { + LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_OPEN_TABLES; - lex->select_lex.db= $3; + lex->select_lex.db= $3; if (prepare_schema_table(YYTHD, lex, 0, SCH_OPEN_TABLES)) MYSQL_YYABORT; - } + } | opt_full PLUGIN_SYM - { - LEX *lex= Lex; - WARN_DEPRECATED(yythd, "5.2", "SHOW PLUGIN", "'SHOW PLUGINS'"); - lex->sql_command= SQLCOM_SHOW_PLUGINS; - if (prepare_schema_table(YYTHD, lex, 0, SCH_PLUGINS)) - MYSQL_YYABORT; - } - | PLUGINS_SYM - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_PLUGINS; - if (prepare_schema_table(YYTHD, lex, 0, SCH_PLUGINS)) - MYSQL_YYABORT; - } - | ENGINE_SYM known_storage_engines show_engine_param - { Lex->create_info.db_type= $2; } - | ENGINE_SYM ALL show_engine_param - { Lex->create_info.db_type= NULL; } - | opt_full COLUMNS from_or_in table_ident opt_db wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_FIELDS; - if ($5) - $4->change_db($5); - if (prepare_schema_table(YYTHD, lex, $4, SCH_COLUMNS)) - MYSQL_YYABORT; - } - | NEW_SYM MASTER_SYM FOR_SYM SLAVE WITH MASTER_LOG_FILE_SYM EQ - TEXT_STRING_sys AND_SYM MASTER_LOG_POS_SYM EQ ulonglong_num - AND_SYM MASTER_SERVER_ID_SYM EQ - ulong_num { - Lex->sql_command = SQLCOM_SHOW_NEW_MASTER; - Lex->mi.log_file_name = $8.str; - Lex->mi.pos = $12; - Lex->mi.server_id = $16; + LEX *lex= Lex; + WARN_DEPRECATED(yythd, "5.2", "SHOW PLUGIN", "'SHOW PLUGINS'"); + lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (prepare_schema_table(YYTHD, lex, 0, SCH_PLUGINS)) + MYSQL_YYABORT; + } + | PLUGINS_SYM + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (prepare_schema_table(YYTHD, lex, 0, SCH_PLUGINS)) + MYSQL_YYABORT; + } + | ENGINE_SYM known_storage_engines show_engine_param + { Lex->create_info.db_type= $2; } + | ENGINE_SYM ALL show_engine_param + { Lex->create_info.db_type= NULL; } + | opt_full COLUMNS from_or_in table_ident opt_db wild_and_where + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_FIELDS; + if ($5) + $4->change_db($5); + if (prepare_schema_table(YYTHD, lex, $4, SCH_COLUMNS)) + MYSQL_YYABORT; + } + | NEW_SYM MASTER_SYM FOR_SYM SLAVE + WITH MASTER_LOG_FILE_SYM EQ + TEXT_STRING_sys /* $8 */ + AND_SYM MASTER_LOG_POS_SYM EQ + ulonglong_num /* $12 */ + AND_SYM MASTER_SERVER_ID_SYM EQ + ulong_num /* $16 */ + { + Lex->sql_command = SQLCOM_SHOW_NEW_MASTER; + Lex->mi.log_file_name = $8.str; + Lex->mi.pos = $12; + Lex->mi.server_id = $16; } | master_or_binary LOGS_SYM { - Lex->sql_command = SQLCOM_SHOW_BINLOGS; + Lex->sql_command = SQLCOM_SHOW_BINLOGS; } | SLAVE HOSTS_SYM { - Lex->sql_command = SQLCOM_SHOW_SLAVE_HOSTS; + Lex->sql_command = SQLCOM_SHOW_SLAVE_HOSTS; } | BINLOG_SYM EVENTS_SYM binlog_in binlog_from { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_BINLOG_EVENTS; + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_BINLOG_EVENTS; } opt_limit_clause_init | keys_or_index from_or_in table_ident opt_db where_clause { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_KEYS; - if ($4) - $3->change_db($4); + if ($4) + $3->change_db($4); if (prepare_schema_table(YYTHD, lex, $3, SCH_STATISTICS)) MYSQL_YYABORT; - } - | COLUMN_SYM TYPES_SYM - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_COLUMN_TYPES; - } - | TABLE_SYM TYPES_SYM - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES; - WARN_DEPRECATED(yythd, "5.2", "SHOW TABLE TYPES", "'SHOW [STORAGE] ENGINES'"); + } + | COLUMN_SYM TYPES_SYM + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_COLUMN_TYPES; + } + | TABLE_SYM TYPES_SYM + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES; + WARN_DEPRECATED(yythd, "5.2", "SHOW TABLE TYPES", "'SHOW [STORAGE] ENGINES'"); if (prepare_schema_table(YYTHD, lex, 0, SCH_ENGINES)) MYSQL_YYABORT; - } - | opt_storage ENGINES_SYM - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES; + } + | opt_storage ENGINES_SYM + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES; if (prepare_schema_table(YYTHD, lex, 0, SCH_ENGINES)) MYSQL_YYABORT; - } - | AUTHORS_SYM - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_AUTHORS; - } - | CONTRIBUTORS_SYM - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_CONTRIBUTORS; - } - | PRIVILEGES - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_PRIVILEGES; - } + } + | AUTHORS_SYM + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_AUTHORS; + } + | CONTRIBUTORS_SYM + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_CONTRIBUTORS; + } + | PRIVILEGES + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_PRIVILEGES; + } | COUNT_SYM '(' '*' ')' WARNINGS { (void) create_select_for_variable("warning_count"); } | COUNT_SYM '(' '*' ')' ERRORS - { (void) create_select_for_variable("error_count"); } + { (void) create_select_for_variable("error_count"); } | WARNINGS opt_limit_clause_init { Lex->sql_command = SQLCOM_SHOW_WARNS;} | ERRORS opt_limit_clause_init @@ -8769,7 +9127,7 @@ show_param: lex->option_type= $1; if (prepare_schema_table(YYTHD, lex, 0, SCH_STATUS)) MYSQL_YYABORT; - } + } | INNOBASE_SYM STATUS_SYM { LEX *lex= Lex; @@ -8777,33 +9135,33 @@ show_param: if (!(lex->create_info.db_type= ha_resolve_by_legacy_type(YYTHD, DB_TYPE_INNODB))) { - my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), "InnoDB"); - MYSQL_YYABORT; + my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), "InnoDB"); + MYSQL_YYABORT; } WARN_DEPRECATED(yythd, "5.2", "SHOW INNODB STATUS", "'SHOW ENGINE INNODB STATUS'"); - } + } | MUTEX_SYM STATUS_SYM { - LEX *lex= Lex; + LEX *lex= Lex; lex->sql_command = SQLCOM_SHOW_ENGINE_MUTEX; if (!(lex->create_info.db_type= ha_resolve_by_legacy_type(YYTHD, DB_TYPE_INNODB))) { - my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), "InnoDB"); - MYSQL_YYABORT; + my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), "InnoDB"); + MYSQL_YYABORT; } WARN_DEPRECATED(yythd, "5.2", "SHOW MUTEX STATUS", "'SHOW ENGINE INNODB MUTEX'"); - } - | opt_full PROCESSLIST_SYM - { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;} + } + | opt_full PROCESSLIST_SYM + { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;} | opt_var_type VARIABLES wild_and_where - { + { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_VARIABLES; lex->option_type= $1; if (prepare_schema_table(YYTHD, lex, 0, SCH_VARIABLES)) MYSQL_YYABORT; - } + } | charset wild_and_where { LEX *lex= Lex; @@ -8818,92 +9176,92 @@ show_param: if (prepare_schema_table(YYTHD, lex, 0, SCH_COLLATIONS)) MYSQL_YYABORT; } - | GRANTS - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_GRANTS; - LEX_USER *curr_user; + | GRANTS + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_GRANTS; + LEX_USER *curr_user; if (!(curr_user= (LEX_USER*) lex->thd->alloc(sizeof(st_lex_user)))) MYSQL_YYABORT; bzero(curr_user, sizeof(st_lex_user)); - lex->grant_user= curr_user; - } - | GRANTS FOR_SYM user - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_GRANTS; - lex->grant_user=$3; - lex->grant_user->password=null_lex_str; - } - | CREATE DATABASE opt_if_not_exists ident - { - Lex->sql_command=SQLCOM_SHOW_CREATE_DB; - Lex->create_info.options=$3; - Lex->name= $4; - } + lex->grant_user= curr_user; + } + | GRANTS FOR_SYM user + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_GRANTS; + lex->grant_user=$3; + lex->grant_user->password=null_lex_str; + } + | CREATE DATABASE opt_if_not_exists ident + { + Lex->sql_command=SQLCOM_SHOW_CREATE_DB; + Lex->create_info.options=$3; + Lex->name= $4; + } | CREATE TABLE_SYM table_ident { LEX *lex= Lex; - lex->sql_command = SQLCOM_SHOW_CREATE; - if (!lex->select_lex.add_table_to_list(YYTHD, $3, NULL,0)) - MYSQL_YYABORT; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->select_lex.add_table_to_list(YYTHD, $3, NULL,0)) + MYSQL_YYABORT; lex->only_view= 0; - lex->create_info.storage_media= HA_SM_DEFAULT; - } + lex->create_info.storage_media= HA_SM_DEFAULT; + } | CREATE VIEW_SYM table_ident { LEX *lex= Lex; - lex->sql_command = SQLCOM_SHOW_CREATE; - if (!lex->select_lex.add_table_to_list(YYTHD, $3, NULL, 0)) - MYSQL_YYABORT; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->select_lex.add_table_to_list(YYTHD, $3, NULL, 0)) + MYSQL_YYABORT; lex->only_view= 1; - } + } | MASTER_SYM STATUS_SYM { - Lex->sql_command = SQLCOM_SHOW_MASTER_STAT; + Lex->sql_command = SQLCOM_SHOW_MASTER_STAT; } | SLAVE STATUS_SYM { - Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; + Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; } - | CREATE PROCEDURE sp_name - { - LEX *lex= Lex; + | CREATE PROCEDURE sp_name + { + LEX *lex= Lex; - lex->sql_command = SQLCOM_SHOW_CREATE_PROC; - lex->spname= $3; - } - | CREATE FUNCTION_SYM sp_name - { - LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PROC; + lex->spname= $3; + } + | CREATE FUNCTION_SYM sp_name + { + LEX *lex= Lex; - lex->sql_command = SQLCOM_SHOW_CREATE_FUNC; - lex->spname= $3; - } - | CREATE TRIGGER_SYM sp_name - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_CREATE_TRIGGER; - lex->spname= $3; - } - | PROCEDURE STATUS_SYM wild_and_where - { + lex->sql_command = SQLCOM_SHOW_CREATE_FUNC; + lex->spname= $3; + } + | CREATE TRIGGER_SYM sp_name + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_CREATE_TRIGGER; + lex->spname= $3; + } + | PROCEDURE STATUS_SYM wild_and_where + { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_STATUS_PROC; - if (!sp_add_to_query_tables(YYTHD, lex, "mysql", "proc", TL_READ)) - MYSQL_YYABORT; + if (!sp_add_to_query_tables(YYTHD, lex, "mysql", "proc", TL_READ)) + MYSQL_YYABORT; if (prepare_schema_table(YYTHD, lex, 0, SCH_PROCEDURES)) MYSQL_YYABORT; - } - | FUNCTION_SYM STATUS_SYM wild_and_where - { + } + | FUNCTION_SYM STATUS_SYM wild_and_where + { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_STATUS_FUNC; - if (!sp_add_to_query_tables(YYTHD, lex, "mysql", "proc", TL_READ)) - MYSQL_YYABORT; + if (!sp_add_to_query_tables(YYTHD, lex, "mysql", "proc", TL_READ)) + MYSQL_YYABORT; if (prepare_schema_table(YYTHD, lex, 0, SCH_PROCEDURES)) MYSQL_YYABORT; - } + } | PROCEDURE CODE_SYM sp_name { #ifdef DBUG_OFF @@ -8911,7 +9269,7 @@ show_param: MYSQL_YYABORT; #else Lex->sql_command= SQLCOM_SHOW_PROC_CODE; - Lex->spname= $3; + Lex->spname= $3; #endif } | FUNCTION_SYM CODE_SYM sp_name @@ -8921,7 +9279,7 @@ show_param: MYSQL_YYABORT; #else Lex->sql_command= SQLCOM_SHOW_FUNC_CODE; - Lex->spname= $3; + Lex->spname= $3; #endif } | CREATE EVENT_SYM sp_name @@ -8929,290 +9287,328 @@ show_param: Lex->spname= $3; Lex->sql_command = SQLCOM_SHOW_CREATE_EVENT; } - ; + ; show_engine_param: - STATUS_SYM - { Lex->sql_command= SQLCOM_SHOW_ENGINE_STATUS; } - | MUTEX_SYM - { Lex->sql_command= SQLCOM_SHOW_ENGINE_MUTEX; } - | LOGS_SYM - { Lex->sql_command= SQLCOM_SHOW_ENGINE_LOGS; }; + STATUS_SYM + { Lex->sql_command= SQLCOM_SHOW_ENGINE_STATUS; } + | MUTEX_SYM + { Lex->sql_command= SQLCOM_SHOW_ENGINE_MUTEX; } + | LOGS_SYM + { Lex->sql_command= SQLCOM_SHOW_ENGINE_LOGS; } + ; master_or_binary: - MASTER_SYM - | BINARY; + MASTER_SYM + | BINARY + ; opt_storage: - /* empty */ - | STORAGE_SYM; + /* empty */ + | STORAGE_SYM + ; opt_db: - /* empty */ { $$= 0; } - | from_or_in ident { $$= $2.str; }; + /* empty */ { $$= 0; } + | from_or_in ident { $$= $2.str; } + ; opt_full: - /* empty */ { Lex->verbose=0; } - | FULL { Lex->verbose=1; }; + /* empty */ { Lex->verbose=0; } + | FULL { Lex->verbose=1; } + ; from_or_in: - FROM - | IN_SYM; + FROM + | IN_SYM + ; binlog_in: - /* empty */ { Lex->mi.log_file_name = 0; } - | IN_SYM TEXT_STRING_sys { Lex->mi.log_file_name = $2.str; }; + /* empty */ { Lex->mi.log_file_name = 0; } + | IN_SYM TEXT_STRING_sys { Lex->mi.log_file_name = $2.str; } + ; binlog_from: - /* empty */ { Lex->mi.pos = 4; /* skip magic number */ } - | FROM ulonglong_num { Lex->mi.pos = $2; }; + /* empty */ { Lex->mi.pos = 4; /* skip magic number */ } + | FROM ulonglong_num { Lex->mi.pos = $2; } + ; wild_and_where: - /* empty */ - | LIKE TEXT_STRING_sys - { Lex->wild= new (YYTHD->mem_root) String($2.str, $2.length, - system_charset_info); } - | WHERE expr - { - Select->where= $2; - if ($2) - $2->top_level_item(); - } - ; - + /* empty */ + | LIKE TEXT_STRING_sys + { + Lex->wild= new (YYTHD->mem_root) String($2.str, $2.length, + system_charset_info); + } + | WHERE expr + { + Select->where= $2; + if ($2) + $2->top_level_item(); + } + ; /* A Oracle compatible synonym for show */ describe: - describe_command table_ident - { - LEX *lex= Lex; - lex->lock_option= TL_READ; - mysql_init_select(lex); - lex->current_select->parsing_place= SELECT_LIST; - lex->sql_command= SQLCOM_SHOW_FIELDS; - lex->select_lex.db= 0; - lex->verbose= 0; - if (prepare_schema_table(YYTHD, lex, $2, SCH_COLUMNS)) - MYSQL_YYABORT; - } - opt_describe_column {} - | describe_command opt_extended_describe - { Lex->describe|= DESCRIBE_NORMAL; } - select + describe_command table_ident { - LEX *lex=Lex; - lex->select_lex.options|= SELECT_DESCRIBE; - } - ; + LEX *lex= Lex; + lex->lock_option= TL_READ; + mysql_init_select(lex); + lex->current_select->parsing_place= SELECT_LIST; + lex->sql_command= SQLCOM_SHOW_FIELDS; + lex->select_lex.db= 0; + lex->verbose= 0; + if (prepare_schema_table(YYTHD, lex, $2, SCH_COLUMNS)) + MYSQL_YYABORT; + } + opt_describe_column {} + | describe_command opt_extended_describe + { Lex->describe|= DESCRIBE_NORMAL; } + select + { + LEX *lex=Lex; + lex->select_lex.options|= SELECT_DESCRIBE; + } + ; describe_command: - DESC - | DESCRIBE; + DESC + | DESCRIBE + ; opt_extended_describe: - /* empty */ {} - | EXTENDED_SYM { Lex->describe|= DESCRIBE_EXTENDED; } - | PARTITIONS_SYM { Lex->describe|= DESCRIBE_PARTITIONS; } - ; - + /* empty */ {} + | EXTENDED_SYM { Lex->describe|= DESCRIBE_EXTENDED; } + | PARTITIONS_SYM { Lex->describe|= DESCRIBE_PARTITIONS; } + ; opt_describe_column: - /* empty */ {} - | text_string { Lex->wild= $1; } - | ident - { Lex->wild= new (YYTHD->mem_root) String((const char*) $1.str,$1.length,system_charset_info); }; + /* empty */ {} + | text_string { Lex->wild= $1; } + | ident + { + Lex->wild= new (YYTHD->mem_root) String((const char*) $1.str, + $1.length, + system_charset_info); + } + ; /* flush things */ flush: - FLUSH_SYM opt_no_write_to_binlog - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_FLUSH; - lex->type= 0; - lex->no_write_to_binlog= $2; - } - flush_options - {} - ; + FLUSH_SYM opt_no_write_to_binlog + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_FLUSH; + lex->type= 0; + lex->no_write_to_binlog= $2; + } + flush_options + {} + ; flush_options: - flush_options ',' flush_option - | flush_option; + flush_options ',' flush_option + | flush_option + ; flush_option: - table_or_tables { Lex->type|= REFRESH_TABLES; } opt_table_list {} - | TABLES WITH READ_SYM LOCK_SYM { Lex->type|= REFRESH_TABLES | REFRESH_READ_LOCK; } - | QUERY_SYM CACHE_SYM { Lex->type|= REFRESH_QUERY_CACHE_FREE; } - | HOSTS_SYM { Lex->type|= REFRESH_HOSTS; } - | PRIVILEGES { Lex->type|= REFRESH_GRANT; } - | LOGS_SYM { Lex->type|= REFRESH_LOG; } - | STATUS_SYM { Lex->type|= REFRESH_STATUS; } - | SLAVE { Lex->type|= REFRESH_SLAVE; } - | MASTER_SYM { Lex->type|= REFRESH_MASTER; } - | DES_KEY_FILE { Lex->type|= REFRESH_DES_KEY_FILE; } - | RESOURCES { Lex->type|= REFRESH_USER_RESOURCES; }; + table_or_tables + { Lex->type|= REFRESH_TABLES; } + opt_table_list {} + | TABLES WITH READ_SYM LOCK_SYM + { Lex->type|= REFRESH_TABLES | REFRESH_READ_LOCK; } + | QUERY_SYM CACHE_SYM + { Lex->type|= REFRESH_QUERY_CACHE_FREE; } + | HOSTS_SYM + { Lex->type|= REFRESH_HOSTS; } + | PRIVILEGES + { Lex->type|= REFRESH_GRANT; } + | LOGS_SYM + { Lex->type|= REFRESH_LOG; } + | STATUS_SYM + { Lex->type|= REFRESH_STATUS; } + | SLAVE + { Lex->type|= REFRESH_SLAVE; } + | MASTER_SYM + { Lex->type|= REFRESH_MASTER; } + | DES_KEY_FILE + { Lex->type|= REFRESH_DES_KEY_FILE; } + | RESOURCES + { Lex->type|= REFRESH_USER_RESOURCES; } + ; opt_table_list: - /* empty */ {;} - | table_list {;}; + /* empty */ {} + | table_list {} + ; reset: - RESET_SYM - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_RESET; lex->type=0; - } reset_options - {} - ; + RESET_SYM + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_RESET; lex->type=0; + } + reset_options + {} + ; reset_options: - reset_options ',' reset_option - | reset_option; + reset_options ',' reset_option + | reset_option + ; reset_option: - SLAVE { Lex->type|= REFRESH_SLAVE; } + SLAVE { Lex->type|= REFRESH_SLAVE; } | MASTER_SYM { Lex->type|= REFRESH_MASTER; } - | QUERY_SYM CACHE_SYM { Lex->type|= REFRESH_QUERY_CACHE;}; + | QUERY_SYM CACHE_SYM { Lex->type|= REFRESH_QUERY_CACHE;} + ; purge: - PURGE - { - LEX *lex=Lex; - lex->type=0; - lex->sql_command = SQLCOM_PURGE; - } purge_options - {} - ; + PURGE + { + LEX *lex=Lex; + lex->type=0; + lex->sql_command = SQLCOM_PURGE; + } + purge_options + {} + ; purge_options: - master_or_binary LOGS_SYM purge_option - ; + master_or_binary LOGS_SYM purge_option + ; purge_option: - TO_SYM TEXT_STRING_sys - { - Lex->to_log = $2.str; - } - | BEFORE_SYM expr - { - LEX *lex= Lex; - lex->value_list.empty(); - lex->value_list.push_front($2); - lex->sql_command= SQLCOM_PURGE_BEFORE; - } - ; + TO_SYM TEXT_STRING_sys + { + Lex->to_log = $2.str; + } + | BEFORE_SYM expr + { + LEX *lex= Lex; + lex->value_list.empty(); + lex->value_list.push_front($2); + lex->sql_command= SQLCOM_PURGE_BEFORE; + } + ; /* kill threads */ kill: - KILL_SYM kill_option expr - { - LEX *lex=Lex; - lex->value_list.empty(); - lex->value_list.push_front($3); - lex->sql_command= SQLCOM_KILL; - }; + KILL_SYM kill_option expr + { + LEX *lex=Lex; + lex->value_list.empty(); + lex->value_list.push_front($3); + lex->sql_command= SQLCOM_KILL; + } + ; kill_option: - /* empty */ { Lex->type= 0; } - | CONNECTION_SYM { Lex->type= 0; } - | QUERY_SYM { Lex->type= ONLY_KILL_QUERY; } + /* empty */ { Lex->type= 0; } + | CONNECTION_SYM { Lex->type= 0; } + | QUERY_SYM { Lex->type= ONLY_KILL_QUERY; } ; /* change database */ -use: USE_SYM ident - { - LEX *lex=Lex; - lex->sql_command=SQLCOM_CHANGE_DB; - lex->select_lex.db= $2.str; - }; +use: + USE_SYM ident + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_CHANGE_DB; + lex->select_lex.db= $2.str; + } + ; /* import, export of files */ -load: LOAD DATA_SYM - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; +load: + LOAD DATA_SYM + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; - if (lex->sphead) - { - my_error(ER_SP_BADSTATEMENT, MYF(0), "LOAD DATA"); - MYSQL_YYABORT; - } - lex->fname_start= lip->get_ptr(); - } - load_data - {} - | - LOAD TABLE_SYM table_ident FROM MASTER_SYM - { - LEX *lex=Lex; - WARN_DEPRECATED(yythd, "5.2", "LOAD TABLE FROM MASTER", - "MySQL Administrator (mysqldump, mysql)"); - if (lex->sphead) - { - my_error(ER_SP_BADSTATEMENT, MYF(0), "LOAD TABLE"); - MYSQL_YYABORT; - } - lex->sql_command = SQLCOM_LOAD_MASTER_TABLE; - if (!Select->add_table_to_list(YYTHD, $3, NULL, TL_OPTION_UPDATING)) - MYSQL_YYABORT; - }; + if (lex->sphead) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), "LOAD DATA"); + MYSQL_YYABORT; + } + lex->fname_start= lip->get_ptr(); + } + load_data + {} + | LOAD TABLE_SYM table_ident FROM MASTER_SYM + { + LEX *lex=Lex; + WARN_DEPRECATED(yythd, "5.2", "LOAD TABLE FROM MASTER", + "MySQL Administrator (mysqldump, mysql)"); + if (lex->sphead) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), "LOAD TABLE"); + MYSQL_YYABORT; + } + lex->sql_command = SQLCOM_LOAD_MASTER_TABLE; + if (!Select->add_table_to_list(YYTHD, $3, NULL, TL_OPTION_UPDATING)) + MYSQL_YYABORT; + } + ; load_data: - load_data_lock opt_local INFILE TEXT_STRING_filesystem - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_LOAD; - lex->lock_option= $1; - lex->local_file= $2; - lex->duplicates= DUP_ERROR; - lex->ignore= 0; - if (!(lex->exchange= new sql_exchange($4.str, 0))) - MYSQL_YYABORT; - } - opt_duplicate INTO - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; - lex->fname_end= lip->get_ptr(); - } - TABLE_SYM table_ident - { - LEX *lex=Lex; - if (!Select->add_table_to_list(YYTHD, $10, NULL, TL_OPTION_UPDATING, - lex->lock_option)) - MYSQL_YYABORT; - lex->field_list.empty(); - lex->update_list.empty(); - lex->value_list.empty(); - } - opt_load_data_charset - { Lex->exchange->cs= $12; } - opt_field_term opt_line_term opt_ignore_lines opt_field_or_var_spec - opt_load_data_set_spec - {} - | - FROM MASTER_SYM - { - Lex->sql_command = SQLCOM_LOAD_MASTER_DATA; - WARN_DEPRECATED(yythd, "5.2", "LOAD DATA FROM MASTER", - "mysqldump or future " - "BACKUP/RESTORE DATABASE facility"); - }; + load_data_lock opt_local INFILE TEXT_STRING_filesystem + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_LOAD; + lex->lock_option= $1; + lex->local_file= $2; + lex->duplicates= DUP_ERROR; + lex->ignore= 0; + if (!(lex->exchange= new sql_exchange($4.str, 0))) + MYSQL_YYABORT; + } + opt_duplicate INTO + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; + lex->fname_end= lip->get_ptr(); + } + TABLE_SYM table_ident + { + LEX *lex=Lex; + if (!Select->add_table_to_list(YYTHD, $10, NULL, TL_OPTION_UPDATING, + lex->lock_option)) + MYSQL_YYABORT; + lex->field_list.empty(); + lex->update_list.empty(); + lex->value_list.empty(); + } + opt_load_data_charset + { Lex->exchange->cs= $12; } + opt_field_term opt_line_term opt_ignore_lines opt_field_or_var_spec + opt_load_data_set_spec + {} + | FROM MASTER_SYM + { + Lex->sql_command = SQLCOM_LOAD_MASTER_DATA; + WARN_DEPRECATED(yythd, "5.2", "LOAD DATA FROM MASTER", + "mysqldump or future " + "BACKUP/RESTORE DATABASE facility"); + } + ; opt_local: - /* empty */ { $$=0;} - | LOCAL_SYM { $$=1;}; + /* empty */ { $$=0;} + | LOCAL_SYM { $$=1;} + ; load_data_lock: - /* empty */ { $$= TL_WRITE_DEFAULT; } - | CONCURRENT + /* empty */ { $$= TL_WRITE_DEFAULT; } + | CONCURRENT { #ifdef HAVE_QUERY_CACHE /* @@ -9224,35 +9620,38 @@ load_data_lock: #endif $$= TL_WRITE_CONCURRENT_INSERT; } - | LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; }; - + | LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; } + ; opt_duplicate: - /* empty */ { Lex->duplicates=DUP_ERROR; } - | REPLACE { Lex->duplicates=DUP_REPLACE; } - | IGNORE_SYM { Lex->ignore= 1; }; + /* empty */ { Lex->duplicates=DUP_ERROR; } + | REPLACE { Lex->duplicates=DUP_REPLACE; } + | IGNORE_SYM { Lex->ignore= 1; } + ; opt_field_term: - /* empty */ - | COLUMNS field_term_list; + /* empty */ + | COLUMNS field_term_list + ; field_term_list: - field_term_list field_term - | field_term; + field_term_list field_term + | field_term + ; field_term: - TERMINATED BY text_string + TERMINATED BY text_string { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->field_term= $3; } - | OPTIONALLY ENCLOSED BY text_string - { + | OPTIONALLY ENCLOSED BY text_string + { LEX *lex= Lex; DBUG_ASSERT(lex->exchange != 0); lex->exchange->enclosed= $4; lex->exchange->opt_enclosed= 1; - } + } | ENCLOSED BY text_string { DBUG_ASSERT(Lex->exchange != 0); @@ -9262,18 +9661,21 @@ field_term: { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->escaped= $3; - }; + } + ; opt_line_term: - /* empty */ - | LINES line_term_list; + /* empty */ + | LINES line_term_list + ; line_term_list: - line_term_list line_term - | line_term; + line_term_list line_term + | line_term + ; line_term: - TERMINATED BY text_string + TERMINATED BY text_string { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->line_term= $3; @@ -9282,68 +9684,71 @@ line_term: { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->line_start= $3; - }; + } + ; opt_ignore_lines: - /* empty */ + /* empty */ | IGNORE_SYM NUM LINES { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->skip_lines= atol($2.str); - }; + } + ; opt_field_or_var_spec: - /* empty */ { } - | '(' fields_or_vars ')' { } - | '(' ')' { }; + /* empty */ {} + | '(' fields_or_vars ')' {} + | '(' ')' {} + ; fields_or_vars: - fields_or_vars ',' field_or_var + fields_or_vars ',' field_or_var { Lex->field_list.push_back($3); } | field_or_var { Lex->field_list.push_back($1); } ; field_or_var: - simple_ident_nospvar {$$= $1;} + simple_ident_nospvar {$$= $1;} | '@' ident_or_text { $$= new Item_user_var_as_out_param($2); } ; opt_load_data_set_spec: - /* empty */ { } - | SET insert_update_list { }; - + /* empty */ {} + | SET insert_update_list {} + ; /* Common definitions */ text_literal: - TEXT_STRING - { - LEX_STRING tmp; - THD *thd= YYTHD; - CHARSET_INFO *cs_con= thd->variables.collation_connection; - CHARSET_INFO *cs_cli= thd->variables.character_set_client; - uint repertoire= thd->lex->text_string_is_7bit && + TEXT_STRING + { + LEX_STRING tmp; + THD *thd= YYTHD; + CHARSET_INFO *cs_con= thd->variables.collation_connection; + CHARSET_INFO *cs_cli= thd->variables.character_set_client; + uint repertoire= thd->lex->text_string_is_7bit && my_charset_is_ascii_based(cs_cli) ? - MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30; - if (thd->charset_is_collation_connection || - (repertoire == MY_REPERTOIRE_ASCII && - my_charset_is_ascii_based(cs_con))) - tmp= $1; - else - thd->convert_string(&tmp, cs_con, $1.str, $1.length, cs_cli); - $$= new Item_string(tmp.str, tmp.length, cs_con, - DERIVATION_COERCIBLE, repertoire); - } + MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30; + if (thd->charset_is_collation_connection || + (repertoire == MY_REPERTOIRE_ASCII && + my_charset_is_ascii_based(cs_con))) + tmp= $1; + else + thd->convert_string(&tmp, cs_con, $1.str, $1.length, cs_cli); + $$= new Item_string(tmp.str, tmp.length, cs_con, + DERIVATION_COERCIBLE, repertoire); + } | NCHAR_STRING - { - uint repertoire= Lex->text_string_is_7bit ? - MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30; - DBUG_ASSERT(my_charset_is_ascii_based(national_charset_info)); - $$= new Item_string($1.str, $1.length, national_charset_info, - DERIVATION_COERCIBLE, repertoire); - } + { + uint repertoire= Lex->text_string_is_7bit ? + MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30; + DBUG_ASSERT(my_charset_is_ascii_based(national_charset_info)); + $$= new Item_string($1.str, $1.length, national_charset_info, + DERIVATION_COERCIBLE, repertoire); + } | UNDERSCORE_CHARSET TEXT_STRING { $$= new Item_string($2.str, $2.length, $1); @@ -9368,75 +9773,78 @@ text_literal: ; text_string: - TEXT_STRING_literal - { $$= new (YYTHD->mem_root) String($1.str,$1.length,YYTHD->variables.collation_connection); } - | HEX_NUM - { - Item *tmp= new Item_hex_string($1.str, $1.length); - /* - it is OK only emulate fix_fields, because we need only + TEXT_STRING_literal + { + $$= new (YYTHD->mem_root) String($1.str, + $1.length, + YYTHD->variables.collation_connection); + } + | HEX_NUM + { + Item *tmp= new Item_hex_string($1.str, $1.length); + /* + it is OK only emulate fix_fields, because we need only value of constant - */ - $$= tmp ? - tmp->quick_fix_field(), tmp->val_str((String*) 0) : - (String*) 0; - } + */ + $$= tmp ? + tmp->quick_fix_field(), tmp->val_str((String*) 0) : + (String*) 0; + } | BIN_NUM { - Item *tmp= new Item_bin_string($1.str, $1.length); - /* - it is OK only emulate fix_fields, because we need only + Item *tmp= new Item_bin_string($1.str, $1.length); + /* + it is OK only emulate fix_fields, because we need only value of constant - */ - $$= tmp ? tmp->quick_fix_field(), tmp->val_str((String*) 0) : - (String*) 0; + */ + $$= tmp ? tmp->quick_fix_field(), tmp->val_str((String*) 0) : + (String*) 0; } - ; + ; param_marker: - PARAM_MARKER - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; - Item_param *item; - if (! lex->parsing_options.allows_variable) + PARAM_MARKER { - my_error(ER_VIEW_SELECT_VARIABLE, MYF(0)); - MYSQL_YYABORT; + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; + Item_param *item; + if (! lex->parsing_options.allows_variable) + { + my_error(ER_VIEW_SELECT_VARIABLE, MYF(0)); + MYSQL_YYABORT; + } + item= new Item_param((uint) (lip->get_tok_start() - thd->query)); + if (!($$= item) || lex->param_list.push_back(item)) + { + my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0)); + MYSQL_YYABORT; + } } - item= new Item_param((uint) (lip->get_tok_start() - thd->query)); - if (!($$= item) || lex->param_list.push_back(item)) - { - my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0)); - MYSQL_YYABORT; - } - } - ; + ; signed_literal: - literal { $$ = $1; } - | '+' NUM_literal { $$ = $2; } - | '-' NUM_literal - { - $2->max_length++; - $$= $2->neg(); - } - ; - + literal { $$ = $1; } + | '+' NUM_literal { $$ = $2; } + | '-' NUM_literal + { + $2->max_length++; + $$= $2->neg(); + } + ; literal: - text_literal { $$ = $1; } - | NUM_literal { $$ = $1; } - | NULL_SYM + text_literal { $$ = $1; } + | NUM_literal { $$ = $1; } + | NULL_SYM { $$ = new Item_null(); YYTHD->m_lip->next_state=MY_LEX_OPERATOR_OR_IDENT; } - | FALSE_SYM { $$= new Item_int((char*) "FALSE",0,1); } - | TRUE_SYM { $$= new Item_int((char*) "TRUE",1,1); } - | HEX_NUM { $$ = new Item_hex_string($1.str, $1.length);} - | BIN_NUM { $$= new Item_bin_string($1.str, $1.length); } + | FALSE_SYM { $$= new Item_int((char*) "FALSE",0,1); } + | TRUE_SYM { $$= new Item_int((char*) "TRUE",1,1); } + | HEX_NUM { $$ = new Item_hex_string($1.str, $1.length);} + | BIN_NUM { $$= new Item_bin_string($1.str, $1.length); } | UNDERSCORE_CHARSET HEX_NUM { Item *tmp= new Item_hex_string($2.str, $2.length); @@ -9453,238 +9861,249 @@ literal: if ($$) ((Item_string *) $$)->set_repertoire_from_value(); } - | UNDERSCORE_CHARSET BIN_NUM + | UNDERSCORE_CHARSET BIN_NUM { - Item *tmp= new Item_bin_string($2.str, $2.length); - /* - it is OK only emulate fix_fieds, because we need only + Item *tmp= new Item_bin_string($2.str, $2.length); + /* + it is OK only emulate fix_fieds, because we need only value of constant - */ - String *str= tmp ? - tmp->quick_fix_field(), tmp->val_str((String*) 0) : - (String*) 0; - $$= new Item_string(str ? str->ptr() : "", - str ? str->length() : 0, - Lex->charset); + */ + String *str= tmp ? + tmp->quick_fix_field(), tmp->val_str((String*) 0) : + (String*) 0; + $$= new Item_string(str ? str->ptr() : "", + str ? str->length() : 0, + Lex->charset); } - | DATE_SYM text_literal { $$ = $2; } - | TIME_SYM text_literal { $$ = $2; } - | TIMESTAMP text_literal { $$ = $2; }; + | DATE_SYM text_literal { $$ = $2; } + | TIME_SYM text_literal { $$ = $2; } + | TIMESTAMP text_literal { $$ = $2; } + ; NUM_literal: - NUM { int error; $$ = new Item_int($1.str, (longlong) my_strtoll10($1.str, NULL, &error), $1.length); } - | LONG_NUM { int error; $$ = new Item_int($1.str, (longlong) my_strtoll10($1.str, NULL, &error), $1.length); } - | ULONGLONG_NUM { $$ = new Item_uint($1.str, $1.length); } + NUM + { + int error; + $$ = new Item_int($1.str, (longlong) my_strtoll10($1.str, NULL, &error), $1.length); + } + | LONG_NUM + { + int error; + $$ = new Item_int($1.str, (longlong) my_strtoll10($1.str, NULL, &error), $1.length); + } + | ULONGLONG_NUM + { $$ = new Item_uint($1.str, $1.length); } | DECIMAL_NUM - { - $$= new Item_decimal($1.str, $1.length, YYTHD->charset()); - if (YYTHD->net.report_error) - { - MYSQL_YYABORT; - } - } - | FLOAT_NUM - { - $$ = new Item_float($1.str, $1.length); - if (YYTHD->net.report_error) - { - MYSQL_YYABORT; - } - } - ; + { + $$= new Item_decimal($1.str, $1.length, YYTHD->charset()); + if (YYTHD->net.report_error) + { + MYSQL_YYABORT; + } + } + | FLOAT_NUM + { + $$ = new Item_float($1.str, $1.length); + if (YYTHD->net.report_error) + { + MYSQL_YYABORT; + } + } + ; /********************************************************************** ** Creating different items. **********************************************************************/ insert_ident: - simple_ident_nospvar { $$=$1; } - | table_wild { $$=$1; }; + simple_ident_nospvar { $$=$1; } + | table_wild { $$=$1; } + ; table_wild: - ident '.' '*' - { - SELECT_LEX *sel= Select; - $$ = new Item_field(Lex->current_context(), NullS, $1.str, "*"); - sel->with_wild++; - } - | ident '.' ident '.' '*' - { - SELECT_LEX *sel= Select; - $$ = new Item_field(Lex->current_context(), (YYTHD->client_capabilities & - CLIENT_NO_SCHEMA ? NullS : $1.str), - $3.str,"*"); - sel->with_wild++; - } - ; + ident '.' '*' + { + SELECT_LEX *sel= Select; + $$ = new Item_field(Lex->current_context(), NullS, $1.str, "*"); + sel->with_wild++; + } + | ident '.' ident '.' '*' + { + SELECT_LEX *sel= Select; + $$ = new Item_field(Lex->current_context(), (YYTHD->client_capabilities & + CLIENT_NO_SCHEMA ? NullS : $1.str), + $3.str,"*"); + sel->with_wild++; + } + ; order_ident: - expr { $$=$1; }; + expr { $$=$1; } + ; simple_ident: - ident - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; - sp_variable_t *spv; - sp_pcontext *spc = lex->spcont; - if (spc && (spv = spc->find_variable(&$1))) - { - /* We're compiling a stored procedure and found a variable */ - if (! lex->parsing_options.allows_variable) + ident + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; + sp_variable_t *spv; + sp_pcontext *spc = lex->spcont; + if (spc && (spv = spc->find_variable(&$1))) { - my_error(ER_VIEW_SELECT_VARIABLE, MYF(0)); - MYSQL_YYABORT; - } + /* We're compiling a stored procedure and found a variable */ + if (! lex->parsing_options.allows_variable) + { + my_error(ER_VIEW_SELECT_VARIABLE, MYF(0)); + MYSQL_YYABORT; + } - Item_splocal *splocal; - splocal= new Item_splocal($1, spv->offset, spv->type, - lip->get_tok_start_prev() - - lex->sphead->m_tmp_query, - lip->get_tok_end() - lip->get_tok_start_prev()); + Item_splocal *splocal; + splocal= new Item_splocal($1, spv->offset, spv->type, + lip->get_tok_start_prev() - + lex->sphead->m_tmp_query, + lip->get_tok_end() - lip->get_tok_start_prev()); #ifndef DBUG_OFF - if (splocal) - splocal->m_sp= lex->sphead; + if (splocal) + splocal->m_sp= lex->sphead; #endif - $$ = (Item*) splocal; - lex->safe_to_cache_query=0; - } - else - { - SELECT_LEX *sel=Select; - $$= (sel->parsing_place != IN_HAVING || - sel->get_in_sum_expr() > 0) ? - (Item*) new Item_field(Lex->current_context(), NullS, NullS, $1.str) : - (Item*) new Item_ref(Lex->current_context(), NullS, NullS, $1.str); - } - } + $$ = (Item*) splocal; + lex->safe_to_cache_query=0; + } + else + { + SELECT_LEX *sel=Select; + $$= (sel->parsing_place != IN_HAVING || + sel->get_in_sum_expr() > 0) ? + (Item*) new Item_field(Lex->current_context(), NullS, NullS, $1.str) : + (Item*) new Item_ref(Lex->current_context(), NullS, NullS, $1.str); + } + } | simple_ident_q { $$= $1; } - ; + ; simple_ident_nospvar: - ident - { - SELECT_LEX *sel=Select; - $$= (sel->parsing_place != IN_HAVING || - sel->get_in_sum_expr() > 0) ? - (Item*) new Item_field(Lex->current_context(), NullS, NullS, $1.str) : - (Item*) new Item_ref(Lex->current_context(), NullS, NullS, $1.str); - } - | simple_ident_q { $$= $1; } - ; + ident + { + SELECT_LEX *sel=Select; + $$= (sel->parsing_place != IN_HAVING || + sel->get_in_sum_expr() > 0) ? + (Item*) new Item_field(Lex->current_context(), NullS, NullS, $1.str) : + (Item*) new Item_ref(Lex->current_context(), NullS, NullS, $1.str); + } + | simple_ident_q { $$= $1; } + ; simple_ident_q: - ident '.' ident - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - - /* - FIXME This will work ok in simple_ident_nospvar case because - we can't meet simple_ident_nospvar in trigger now. But it - should be changed in future. - */ - if (lex->sphead && lex->sphead->m_type == TYPE_ENUM_TRIGGER && - (!my_strcasecmp(system_charset_info, $1.str, "NEW") || - !my_strcasecmp(system_charset_info, $1.str, "OLD"))) + ident '.' ident { - Item_trigger_field *trg_fld; - bool new_row= ($1.str[0]=='N' || $1.str[0]=='n'); - - if (lex->trg_chistics.event == TRG_EVENT_INSERT && - !new_row) - { - my_error(ER_TRG_NO_SUCH_ROW_IN_TRG, MYF(0), "OLD", "on INSERT"); - MYSQL_YYABORT; - } - - if (lex->trg_chistics.event == TRG_EVENT_DELETE && - new_row) - { - my_error(ER_TRG_NO_SUCH_ROW_IN_TRG, MYF(0), "NEW", "on DELETE"); - MYSQL_YYABORT; - } - - DBUG_ASSERT(!new_row || - (lex->trg_chistics.event == TRG_EVENT_INSERT || - lex->trg_chistics.event == TRG_EVENT_UPDATE)); - const bool read_only= - !(new_row && lex->trg_chistics.action_time == TRG_ACTION_BEFORE); - if (!(trg_fld= new Item_trigger_field(Lex->current_context(), - new_row ? - Item_trigger_field::NEW_ROW: - Item_trigger_field::OLD_ROW, - $3.str, - SELECT_ACL, - read_only))) - MYSQL_YYABORT; + THD *thd= YYTHD; + LEX *lex= thd->lex; /* - Let us add this item to list of all Item_trigger_field objects - in trigger. + FIXME This will work ok in simple_ident_nospvar case because + we can't meet simple_ident_nospvar in trigger now. But it + should be changed in future. */ - lex->trg_table_fields.link_in_list((uchar*) trg_fld, - (uchar**) &trg_fld-> - next_trg_field); + if (lex->sphead && lex->sphead->m_type == TYPE_ENUM_TRIGGER && + (!my_strcasecmp(system_charset_info, $1.str, "NEW") || + !my_strcasecmp(system_charset_info, $1.str, "OLD"))) + { + Item_trigger_field *trg_fld; + bool new_row= ($1.str[0]=='N' || $1.str[0]=='n'); - $$= (Item *)trg_fld; + if (lex->trg_chistics.event == TRG_EVENT_INSERT && + !new_row) + { + my_error(ER_TRG_NO_SUCH_ROW_IN_TRG, MYF(0), "OLD", "on INSERT"); + MYSQL_YYABORT; + } + + if (lex->trg_chistics.event == TRG_EVENT_DELETE && + new_row) + { + my_error(ER_TRG_NO_SUCH_ROW_IN_TRG, MYF(0), "NEW", "on DELETE"); + MYSQL_YYABORT; + } + + DBUG_ASSERT(!new_row || + (lex->trg_chistics.event == TRG_EVENT_INSERT || + lex->trg_chistics.event == TRG_EVENT_UPDATE)); + const bool read_only= + !(new_row && lex->trg_chistics.action_time == TRG_ACTION_BEFORE); + if (!(trg_fld= new Item_trigger_field(Lex->current_context(), + new_row ? + Item_trigger_field::NEW_ROW: + Item_trigger_field::OLD_ROW, + $3.str, + SELECT_ACL, + read_only))) + MYSQL_YYABORT; + + /* + Let us add this item to list of all Item_trigger_field objects + in trigger. + */ + lex->trg_table_fields.link_in_list((uchar*) trg_fld, + (uchar**) &trg_fld->next_trg_field); + + $$= (Item *)trg_fld; + } + else + { + SELECT_LEX *sel= lex->current_select; + if (sel->no_table_names_allowed) + { + my_error(ER_TABLENAME_NOT_ALLOWED_HERE, + MYF(0), $1.str, thd->where); + } + $$= (sel->parsing_place != IN_HAVING || + sel->get_in_sum_expr() > 0) ? + (Item*) new Item_field(Lex->current_context(), NullS, $1.str, $3.str) : + (Item*) new Item_ref(Lex->current_context(), NullS, $1.str, $3.str); + } } - else + | '.' ident '.' ident { - SELECT_LEX *sel= lex->current_select; - if (sel->no_table_names_allowed) - { - my_error(ER_TABLENAME_NOT_ALLOWED_HERE, - MYF(0), $1.str, thd->where); - } - $$= (sel->parsing_place != IN_HAVING || - sel->get_in_sum_expr() > 0) ? - (Item*) new Item_field(Lex->current_context(), NullS, $1.str, $3.str) : - (Item*) new Item_ref(Lex->current_context(), NullS, $1.str, $3.str); + THD *thd= YYTHD; + LEX *lex= thd->lex; + SELECT_LEX *sel= lex->current_select; + if (sel->no_table_names_allowed) + { + my_error(ER_TABLENAME_NOT_ALLOWED_HERE, + MYF(0), $2.str, thd->where); + } + $$= (sel->parsing_place != IN_HAVING || + sel->get_in_sum_expr() > 0) ? + (Item*) new Item_field(Lex->current_context(), NullS, $2.str, $4.str) : + (Item*) new Item_ref(Lex->current_context(), NullS, $2.str, $4.str); } - } - | '.' ident '.' ident - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - SELECT_LEX *sel= lex->current_select; - if (sel->no_table_names_allowed) - { - my_error(ER_TABLENAME_NOT_ALLOWED_HERE, - MYF(0), $2.str, thd->where); - } - $$= (sel->parsing_place != IN_HAVING || - sel->get_in_sum_expr() > 0) ? - (Item*) new Item_field(Lex->current_context(), NullS, $2.str, $4.str) : - (Item*) new Item_ref(Lex->current_context(), NullS, $2.str, $4.str); - } - | ident '.' ident '.' ident - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - SELECT_LEX *sel= lex->current_select; - if (sel->no_table_names_allowed) - { - my_error(ER_TABLENAME_NOT_ALLOWED_HERE, - MYF(0), $3.str, thd->where); - } - $$= (sel->parsing_place != IN_HAVING || - sel->get_in_sum_expr() > 0) ? - (Item*) new Item_field(Lex->current_context(), + | ident '.' ident '.' ident + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + SELECT_LEX *sel= lex->current_select; + if (sel->no_table_names_allowed) + { + my_error(ER_TABLENAME_NOT_ALLOWED_HERE, + MYF(0), $3.str, thd->where); + } + $$= (sel->parsing_place != IN_HAVING || + sel->get_in_sum_expr() > 0) ? + (Item*) new Item_field(Lex->current_context(), + (YYTHD->client_capabilities & + CLIENT_NO_SCHEMA ? NullS : $1.str), + $3.str, $5.str) : + (Item*) new Item_ref(Lex->current_context(), (YYTHD->client_capabilities & - CLIENT_NO_SCHEMA ? NullS : $1.str), - $3.str, $5.str) : - (Item*) new Item_ref(Lex->current_context(), - (YYTHD->client_capabilities & - CLIENT_NO_SCHEMA ? NullS : $1.str), - $3.str, $5.str); - }; - + CLIENT_NO_SCHEMA ? NullS : $1.str), + $3.str, $5.str); + } + ; field_ident: - ident { $$=$1;} - | ident '.' ident '.' ident + ident { $$=$1;} + | ident '.' ident '.' ident { TABLE_LIST *table= (TABLE_LIST*) Select->table_list.first; if (my_strcasecmp(table_alias_charset, $1.str, table->db)) @@ -9700,7 +10119,7 @@ field_ident: } $$=$5; } - | ident '.' ident + | ident '.' ident { TABLE_LIST *table= (TABLE_LIST*) Select->table_list.first; if (my_strcasecmp(table_alias_charset, $1.str, table->alias)) @@ -9710,25 +10129,30 @@ field_ident: } $$=$3; } - | '.' ident { $$=$2;} /* For Delphi */; + | '.' ident { $$=$2;} /* For Delphi */ + ; table_ident: - ident { $$=new Table_ident($1); } - | ident '.' ident { $$=new Table_ident(YYTHD, $1,$3,0);} - | '.' ident { $$=new Table_ident($2);} /* For Delphi */ + ident { $$=new Table_ident($1); } + | ident '.' ident { $$=new Table_ident(YYTHD, $1,$3,0);} + | '.' ident { $$=new Table_ident($2);} /* For Delphi */ ; table_ident_nodb: - ident { LEX_STRING db={(char*) any_db,3}; $$=new Table_ident(YYTHD, db,$1,0); } + ident + { + LEX_STRING db={(char*) any_db,3}; + $$=new Table_ident(YYTHD, db,$1,0); + } ; IDENT_sys: - IDENT { $$= $1; } - | IDENT_QUOTED - { - THD *thd= YYTHD; + IDENT { $$= $1; } + | IDENT_QUOTED + { + THD *thd= YYTHD; - if (thd->charset_is_system_charset) + if (thd->charset_is_system_charset) { CHARSET_INFO *cs= system_charset_info; int dummy_error; @@ -9741,179 +10165,180 @@ IDENT_sys: cs->csname, $1.str + wlen); MYSQL_YYABORT; } - $$= $1; + $$= $1; } - else - thd->convert_string(&$$, system_charset_info, - $1.str, $1.length, thd->charset()); - } - ; + else + thd->convert_string(&$$, system_charset_info, + $1.str, $1.length, thd->charset()); + } + ; TEXT_STRING_sys: - TEXT_STRING - { - THD *thd= YYTHD; + TEXT_STRING + { + THD *thd= YYTHD; - if (thd->charset_is_system_charset) - $$= $1; - else - thd->convert_string(&$$, system_charset_info, - $1.str, $1.length, thd->charset()); - } - ; + if (thd->charset_is_system_charset) + $$= $1; + else + thd->convert_string(&$$, system_charset_info, + $1.str, $1.length, thd->charset()); + } + ; TEXT_STRING_literal: - TEXT_STRING - { - THD *thd= YYTHD; - - if (thd->charset_is_collation_connection) - $$= $1; - else - thd->convert_string(&$$, thd->variables.collation_connection, - $1.str, $1.length, thd->charset()); - } - ; + TEXT_STRING + { + THD *thd= YYTHD; + if (thd->charset_is_collation_connection) + $$= $1; + else + thd->convert_string(&$$, thd->variables.collation_connection, + $1.str, $1.length, thd->charset()); + } + ; TEXT_STRING_filesystem: - TEXT_STRING - { - THD *thd= YYTHD; + TEXT_STRING + { + THD *thd= YYTHD; - if (thd->charset_is_character_set_filesystem) - $$= $1; - else - thd->convert_string(&$$, thd->variables.character_set_filesystem, - $1.str, $1.length, thd->charset()); - } - ; + if (thd->charset_is_character_set_filesystem) + $$= $1; + else + thd->convert_string(&$$, thd->variables.character_set_filesystem, + $1.str, $1.length, thd->charset()); + } + ; ident: - IDENT_sys { $$=$1; } - | READ_ONLY_SYM - { - THD *thd= YYTHD; - $$.str= thd->strmake("read_only",9); - $$.length= 9; - } - | keyword - { - THD *thd= YYTHD; - $$.str= thd->strmake($1.str, $1.length); - $$.length= $1.length; - } - ; + IDENT_sys { $$=$1; } + | READ_ONLY_SYM + { + THD *thd= YYTHD; + $$.str= thd->strmake("read_only",9); + $$.length= 9; + } + | keyword + { + THD *thd= YYTHD; + $$.str= thd->strmake($1.str, $1.length); + $$.length= $1.length; + } + ; label_ident: - IDENT_sys { $$=$1; } - | keyword_sp - { - THD *thd= YYTHD; - $$.str= thd->strmake($1.str, $1.length); - $$.length= $1.length; - } - ; + IDENT_sys { $$=$1; } + | keyword_sp + { + THD *thd= YYTHD; + $$.str= thd->strmake($1.str, $1.length); + $$.length= $1.length; + } + ; ident_or_text: - ident { $$=$1;} - | TEXT_STRING_sys { $$=$1;} - | LEX_HOSTNAME { $$=$1;}; + ident { $$=$1;} + | TEXT_STRING_sys { $$=$1;} + | LEX_HOSTNAME { $$=$1;} + ; user: - ident_or_text - { - THD *thd= YYTHD; - if (!($$=(LEX_USER*) thd->alloc(sizeof(st_lex_user)))) - MYSQL_YYABORT; - $$->user = $1; - $$->host.str= (char *) "%"; - $$->host.length= 1; + ident_or_text + { + THD *thd= YYTHD; + if (!($$=(LEX_USER*) thd->alloc(sizeof(st_lex_user)))) + MYSQL_YYABORT; + $$->user = $1; + $$->host.str= (char *) "%"; + $$->host.length= 1; - if (check_string_char_length(&$$->user, ER(ER_USERNAME), - USERNAME_CHAR_LENGTH, - system_charset_info, 0)) - MYSQL_YYABORT; - } - | ident_or_text '@' ident_or_text - { - THD *thd= YYTHD; - if (!($$=(LEX_USER*) thd->alloc(sizeof(st_lex_user)))) - MYSQL_YYABORT; - $$->user = $1; $$->host=$3; + if (check_string_char_length(&$$->user, ER(ER_USERNAME), + USERNAME_CHAR_LENGTH, + system_charset_info, 0)) + MYSQL_YYABORT; + } + | ident_or_text '@' ident_or_text + { + THD *thd= YYTHD; + if (!($$=(LEX_USER*) thd->alloc(sizeof(st_lex_user)))) + MYSQL_YYABORT; + $$->user = $1; $$->host=$3; - if (check_string_char_length(&$$->user, ER(ER_USERNAME), + if (check_string_char_length(&$$->user, ER(ER_USERNAME), USERNAME_CHAR_LENGTH, system_charset_info, 0) || - check_string_byte_length(&$$->host, ER(ER_HOSTNAME), + check_string_byte_length(&$$->host, ER(ER_HOSTNAME), HOSTNAME_LENGTH)) - MYSQL_YYABORT; - } - | CURRENT_USER optional_braces - { - if (!($$=(LEX_USER*) YYTHD->alloc(sizeof(st_lex_user)))) - MYSQL_YYABORT; - /* - empty LEX_USER means current_user and - will be handled in the get_current_user() function - later - */ - bzero($$, sizeof(LEX_USER)); - }; + MYSQL_YYABORT; + } + | CURRENT_USER optional_braces + { + if (!($$=(LEX_USER*) YYTHD->alloc(sizeof(st_lex_user)))) + MYSQL_YYABORT; + /* + empty LEX_USER means current_user and + will be handled in the get_current_user() function + later + */ + bzero($$, sizeof(LEX_USER)); + } + ; /* Keyword that we allow for identifiers (except SP labels) */ keyword: - keyword_sp {} - | ASCII_SYM {} - | BACKUP_SYM {} - | BEGIN_SYM {} - | BYTE_SYM {} - | CACHE_SYM {} - | CHARSET {} - | CHECKSUM_SYM {} - | CLOSE_SYM {} - | COMMENT_SYM {} - | COMMIT_SYM {} - | CONTAINS_SYM {} + keyword_sp {} + | ASCII_SYM {} + | BACKUP_SYM {} + | BEGIN_SYM {} + | BYTE_SYM {} + | CACHE_SYM {} + | CHARSET {} + | CHECKSUM_SYM {} + | CLOSE_SYM {} + | COMMENT_SYM {} + | COMMIT_SYM {} + | CONTAINS_SYM {} | DEALLOCATE_SYM {} - | DO_SYM {} - | END {} - | EXECUTE_SYM {} - | FLUSH_SYM {} - | HANDLER_SYM {} - | HELP_SYM {} - | HOST_SYM {} + | DO_SYM {} + | END {} + | EXECUTE_SYM {} + | FLUSH_SYM {} + | HANDLER_SYM {} + | HELP_SYM {} + | HOST_SYM {} | INSTALL_SYM {} - | LANGUAGE_SYM {} - | NO_SYM {} - | OPEN_SYM {} - | OPTIONS_SYM {} - | OWNER_SYM {} + | LANGUAGE_SYM {} + | NO_SYM {} + | OPEN_SYM {} + | OPTIONS_SYM {} + | OWNER_SYM {} | PARSER_SYM {} - | PARTITION_SYM {} + | PARTITION_SYM {} | PORT_SYM {} | PREPARE_SYM {} - | REMOVE_SYM {} - | REPAIR {} - | RESET_SYM {} - | RESTORE_SYM {} - | ROLLBACK_SYM {} - | SAVEPOINT_SYM {} - | SECURITY_SYM {} + | REMOVE_SYM {} + | REPAIR {} + | RESET_SYM {} + | RESTORE_SYM {} + | ROLLBACK_SYM {} + | SAVEPOINT_SYM {} + | SECURITY_SYM {} | SERVER_SYM {} - | SIGNED_SYM {} - | SOCKET_SYM {} - | SLAVE {} + | SIGNED_SYM {} + | SOCKET_SYM {} + | SLAVE {} | SONAME_SYM {} - | START_SYM {} - | STOP_SYM {} - | TRUNCATE_SYM {} - | UNICODE_SYM {} + | START_SYM {} + | STOP_SYM {} + | TRUNCATE_SYM {} + | UNICODE_SYM {} | UNINSTALL_SYM {} - | WRAPPER_SYM {} + | WRAPPER_SYM {} | XA_SYM {} | UPGRADE_SYM {} - ; + ; /* * Keywords that we allow for labels in SPs. @@ -9922,586 +10347,590 @@ keyword: * conflicts. */ keyword_sp: - ACTION {} - | ADDDATE_SYM {} - | AFTER_SYM {} - | AGAINST {} - | AGGREGATE_SYM {} - | ALGORITHM_SYM {} - | ANY_SYM {} - | AT_SYM {} - | AUTHORS_SYM {} - | AUTO_INC {} - | AUTOEXTEND_SIZE_SYM {} - | AVG_ROW_LENGTH {} - | AVG_SYM {} - | BINLOG_SYM {} - | BIT_SYM {} - | BOOL_SYM {} - | BOOLEAN_SYM {} - | BTREE_SYM {} - | CASCADED {} - | CHAIN_SYM {} - | CHANGED {} - | CIPHER_SYM {} - | CLIENT_SYM {} - | COALESCE {} - | CODE_SYM {} - | COLLATION_SYM {} - | COLUMNS {} - | COMMITTED_SYM {} - | COMPACT_SYM {} - | COMPLETION_SYM {} - | COMPRESSED_SYM {} - | CONCURRENT {} - | CONNECTION_SYM {} - | CONSISTENT_SYM {} - | CONTRIBUTORS_SYM {} - | CUBE_SYM {} - | DATA_SYM {} - | DATAFILE_SYM {} - | DATETIME {} - | DATE_SYM {} - | DAY_SYM {} - | DEFINER_SYM {} - | DELAY_KEY_WRITE_SYM {} - | DES_KEY_FILE {} - | DIRECTORY_SYM {} - | DISABLE_SYM {} - | DISCARD {} - | DISK_SYM {} - | DUMPFILE {} - | DUPLICATE_SYM {} - | DYNAMIC_SYM {} - | ENDS_SYM {} - | ENUM {} - | ENGINE_SYM {} - | ENGINES_SYM {} - | ERRORS {} - | ESCAPE_SYM {} - | EVENT_SYM {} - | EVENTS_SYM {} - | EVERY_SYM {} - | EXPANSION_SYM {} - | EXTENDED_SYM {} - | EXTENT_SIZE_SYM {} - | FAST_SYM {} - | FOUND_SYM {} - | ENABLE_SYM {} - | FULL {} - | FILE_SYM {} - | FIRST_SYM {} - | FIXED_SYM {} - | FRAC_SECOND_SYM {} - | GEOMETRY_SYM {} - | GEOMETRYCOLLECTION {} - | GET_FORMAT {} - | GRANTS {} - | GLOBAL_SYM {} - | HASH_SYM {} - | HOSTS_SYM {} - | HOUR_SYM {} - | IDENTIFIED_SYM {} - | INVOKER_SYM {} - | IMPORT {} - | INDEXES {} - | INITIAL_SIZE_SYM {} - | ISOLATION {} - | ISSUER_SYM {} - | INNOBASE_SYM {} - | INSERT_METHOD {} - | KEY_BLOCK_SIZE {} - | LAST_SYM {} - | LEAVES {} - | LESS_SYM {} - | LEVEL_SYM {} - | LINESTRING {} - | LIST_SYM {} - | LOCAL_SYM {} - | LOCKS_SYM {} - | LOGFILE_SYM {} - | LOGS_SYM {} - | MAX_ROWS {} - | MASTER_SYM {} - | MASTER_HOST_SYM {} - | MASTER_PORT_SYM {} - | MASTER_LOG_FILE_SYM {} - | MASTER_LOG_POS_SYM {} - | MASTER_USER_SYM {} - | MASTER_PASSWORD_SYM {} - | MASTER_SERVER_ID_SYM {} - | MASTER_CONNECT_RETRY_SYM {} - | MASTER_SSL_SYM {} - | MASTER_SSL_CA_SYM {} - | MASTER_SSL_CAPATH_SYM {} - | MASTER_SSL_CERT_SYM {} - | MASTER_SSL_CIPHER_SYM {} - | MASTER_SSL_KEY_SYM {} - | MAX_CONNECTIONS_PER_HOUR {} - | MAX_QUERIES_PER_HOUR {} - | MAX_SIZE_SYM {} - | MAX_UPDATES_PER_HOUR {} - | MAX_USER_CONNECTIONS_SYM {} - | MAX_VALUE_SYM {} - | MEDIUM_SYM {} - | MEMORY_SYM {} - | MERGE_SYM {} - | MICROSECOND_SYM {} - | MIGRATE_SYM {} - | MINUTE_SYM {} - | MIN_ROWS {} - | MODIFY_SYM {} - | MODE_SYM {} - | MONTH_SYM {} - | MULTILINESTRING {} - | MULTIPOINT {} - | MULTIPOLYGON {} - | MUTEX_SYM {} - | NAME_SYM {} - | NAMES_SYM {} - | NATIONAL_SYM {} - | NCHAR_SYM {} - | NDBCLUSTER_SYM {} - | NEXT_SYM {} - | NEW_SYM {} - | NO_WAIT_SYM {} - | NODEGROUP_SYM {} - | NONE_SYM {} - | NVARCHAR_SYM {} - | OFFSET_SYM {} - | OLD_PASSWORD {} - | ONE_SHOT_SYM {} - | ONE_SYM {} - | PACK_KEYS_SYM {} - | PARTIAL {} - | PARTITIONING_SYM {} - | PARTITIONS_SYM {} - | PASSWORD {} - | PHASE_SYM {} - | PLUGIN_SYM {} - | PLUGINS_SYM {} - | POINT_SYM {} - | POLYGON {} - | PRESERVE_SYM {} - | PREV_SYM {} - | PRIVILEGES {} - | PROCESS {} - | PROCESSLIST_SYM {} - | QUARTER_SYM {} - | QUERY_SYM {} - | QUICK {} - | REBUILD_SYM {} - | RECOVER_SYM {} - | REDO_BUFFER_SIZE_SYM {} - | REDOFILE_SYM {} - | REDUNDANT_SYM {} - | RELAY_LOG_FILE_SYM {} - | RELAY_LOG_POS_SYM {} - | RELAY_THREAD {} - | RELOAD {} - | REORGANIZE_SYM {} - | REPEATABLE_SYM {} - | REPLICATION {} - | RESOURCES {} - | RESUME_SYM {} - | RETURNS_SYM {} - | ROLLUP_SYM {} - | ROUTINE_SYM {} - | ROWS_SYM {} - | ROW_FORMAT_SYM {} - | ROW_SYM {} - | RTREE_SYM {} - | SCHEDULE_SYM {} - | SECOND_SYM {} - | SERIAL_SYM {} - | SERIALIZABLE_SYM {} - | SESSION_SYM {} - | SIMPLE_SYM {} - | SHARE_SYM {} - | SHUTDOWN {} - | SNAPSHOT_SYM {} - | SOUNDS_SYM {} - | SQL_CACHE_SYM {} - | SQL_BUFFER_RESULT {} - | SQL_NO_CACHE_SYM {} - | SQL_THREAD {} - | STARTS_SYM {} - | STATUS_SYM {} - | STORAGE_SYM {} - | STRING_SYM {} - | SUBDATE_SYM {} - | SUBJECT_SYM {} - | SUBPARTITION_SYM {} - | SUBPARTITIONS_SYM {} - | SUPER_SYM {} - | SUSPEND_SYM {} - | TABLES {} - | TABLESPACE {} - | TEMPORARY {} - | TEMPTABLE_SYM {} - | TEXT_SYM {} - | THAN_SYM {} - | TRANSACTION_SYM {} - | TRIGGERS_SYM {} - | TIMESTAMP {} - | TIMESTAMP_ADD {} - | TIMESTAMP_DIFF {} - | TIME_SYM {} - | TYPES_SYM {} - | TYPE_SYM {} - | UDF_RETURNS_SYM {} - | FUNCTION_SYM {} - | UNCOMMITTED_SYM {} - | UNDEFINED_SYM {} - | UNDO_BUFFER_SIZE_SYM {} - | UNDOFILE_SYM {} - | UNKNOWN_SYM {} - | UNTIL_SYM {} - | USER {} - | USE_FRM {} - | VARIABLES {} - | VIEW_SYM {} - | VALUE_SYM {} - | WARNINGS {} - | WAIT_SYM {} - | WEEK_SYM {} - | WORK_SYM {} - | X509_SYM {} - | YEAR_SYM {} - ; + ACTION {} + | ADDDATE_SYM {} + | AFTER_SYM {} + | AGAINST {} + | AGGREGATE_SYM {} + | ALGORITHM_SYM {} + | ANY_SYM {} + | AT_SYM {} + | AUTHORS_SYM {} + | AUTO_INC {} + | AUTOEXTEND_SIZE_SYM {} + | AVG_ROW_LENGTH {} + | AVG_SYM {} + | BINLOG_SYM {} + | BIT_SYM {} + | BOOL_SYM {} + | BOOLEAN_SYM {} + | BTREE_SYM {} + | CASCADED {} + | CHAIN_SYM {} + | CHANGED {} + | CIPHER_SYM {} + | CLIENT_SYM {} + | COALESCE {} + | CODE_SYM {} + | COLLATION_SYM {} + | COLUMNS {} + | COMMITTED_SYM {} + | COMPACT_SYM {} + | COMPLETION_SYM {} + | COMPRESSED_SYM {} + | CONCURRENT {} + | CONNECTION_SYM {} + | CONSISTENT_SYM {} + | CONTRIBUTORS_SYM {} + | CUBE_SYM {} + | DATA_SYM {} + | DATAFILE_SYM {} + | DATETIME {} + | DATE_SYM {} + | DAY_SYM {} + | DEFINER_SYM {} + | DELAY_KEY_WRITE_SYM {} + | DES_KEY_FILE {} + | DIRECTORY_SYM {} + | DISABLE_SYM {} + | DISCARD {} + | DISK_SYM {} + | DUMPFILE {} + | DUPLICATE_SYM {} + | DYNAMIC_SYM {} + | ENDS_SYM {} + | ENUM {} + | ENGINE_SYM {} + | ENGINES_SYM {} + | ERRORS {} + | ESCAPE_SYM {} + | EVENT_SYM {} + | EVENTS_SYM {} + | EVERY_SYM {} + | EXPANSION_SYM {} + | EXTENDED_SYM {} + | EXTENT_SIZE_SYM {} + | FAST_SYM {} + | FOUND_SYM {} + | ENABLE_SYM {} + | FULL {} + | FILE_SYM {} + | FIRST_SYM {} + | FIXED_SYM {} + | FRAC_SECOND_SYM {} + | GEOMETRY_SYM {} + | GEOMETRYCOLLECTION {} + | GET_FORMAT {} + | GRANTS {} + | GLOBAL_SYM {} + | HASH_SYM {} + | HOSTS_SYM {} + | HOUR_SYM {} + | IDENTIFIED_SYM {} + | INVOKER_SYM {} + | IMPORT {} + | INDEXES {} + | INITIAL_SIZE_SYM {} + | ISOLATION {} + | ISSUER_SYM {} + | INNOBASE_SYM {} + | INSERT_METHOD {} + | KEY_BLOCK_SIZE {} + | LAST_SYM {} + | LEAVES {} + | LESS_SYM {} + | LEVEL_SYM {} + | LINESTRING {} + | LIST_SYM {} + | LOCAL_SYM {} + | LOCKS_SYM {} + | LOGFILE_SYM {} + | LOGS_SYM {} + | MAX_ROWS {} + | MASTER_SYM {} + | MASTER_HOST_SYM {} + | MASTER_PORT_SYM {} + | MASTER_LOG_FILE_SYM {} + | MASTER_LOG_POS_SYM {} + | MASTER_USER_SYM {} + | MASTER_PASSWORD_SYM {} + | MASTER_SERVER_ID_SYM {} + | MASTER_CONNECT_RETRY_SYM {} + | MASTER_SSL_SYM {} + | MASTER_SSL_CA_SYM {} + | MASTER_SSL_CAPATH_SYM {} + | MASTER_SSL_CERT_SYM {} + | MASTER_SSL_CIPHER_SYM {} + | MASTER_SSL_KEY_SYM {} + | MAX_CONNECTIONS_PER_HOUR {} + | MAX_QUERIES_PER_HOUR {} + | MAX_SIZE_SYM {} + | MAX_UPDATES_PER_HOUR {} + | MAX_USER_CONNECTIONS_SYM {} + | MAX_VALUE_SYM {} + | MEDIUM_SYM {} + | MEMORY_SYM {} + | MERGE_SYM {} + | MICROSECOND_SYM {} + | MIGRATE_SYM {} + | MINUTE_SYM {} + | MIN_ROWS {} + | MODIFY_SYM {} + | MODE_SYM {} + | MONTH_SYM {} + | MULTILINESTRING {} + | MULTIPOINT {} + | MULTIPOLYGON {} + | MUTEX_SYM {} + | NAME_SYM {} + | NAMES_SYM {} + | NATIONAL_SYM {} + | NCHAR_SYM {} + | NDBCLUSTER_SYM {} + | NEXT_SYM {} + | NEW_SYM {} + | NO_WAIT_SYM {} + | NODEGROUP_SYM {} + | NONE_SYM {} + | NVARCHAR_SYM {} + | OFFSET_SYM {} + | OLD_PASSWORD {} + | ONE_SHOT_SYM {} + | ONE_SYM {} + | PACK_KEYS_SYM {} + | PARTIAL {} + | PARTITIONING_SYM {} + | PARTITIONS_SYM {} + | PASSWORD {} + | PHASE_SYM {} + | PLUGIN_SYM {} + | PLUGINS_SYM {} + | POINT_SYM {} + | POLYGON {} + | PRESERVE_SYM {} + | PREV_SYM {} + | PRIVILEGES {} + | PROCESS {} + | PROCESSLIST_SYM {} + | QUARTER_SYM {} + | QUERY_SYM {} + | QUICK {} + | REBUILD_SYM {} + | RECOVER_SYM {} + | REDO_BUFFER_SIZE_SYM {} + | REDOFILE_SYM {} + | REDUNDANT_SYM {} + | RELAY_LOG_FILE_SYM {} + | RELAY_LOG_POS_SYM {} + | RELAY_THREAD {} + | RELOAD {} + | REORGANIZE_SYM {} + | REPEATABLE_SYM {} + | REPLICATION {} + | RESOURCES {} + | RESUME_SYM {} + | RETURNS_SYM {} + | ROLLUP_SYM {} + | ROUTINE_SYM {} + | ROWS_SYM {} + | ROW_FORMAT_SYM {} + | ROW_SYM {} + | RTREE_SYM {} + | SCHEDULE_SYM {} + | SECOND_SYM {} + | SERIAL_SYM {} + | SERIALIZABLE_SYM {} + | SESSION_SYM {} + | SIMPLE_SYM {} + | SHARE_SYM {} + | SHUTDOWN {} + | SNAPSHOT_SYM {} + | SOUNDS_SYM {} + | SQL_CACHE_SYM {} + | SQL_BUFFER_RESULT {} + | SQL_NO_CACHE_SYM {} + | SQL_THREAD {} + | STARTS_SYM {} + | STATUS_SYM {} + | STORAGE_SYM {} + | STRING_SYM {} + | SUBDATE_SYM {} + | SUBJECT_SYM {} + | SUBPARTITION_SYM {} + | SUBPARTITIONS_SYM {} + | SUPER_SYM {} + | SUSPEND_SYM {} + | TABLES {} + | TABLESPACE {} + | TEMPORARY {} + | TEMPTABLE_SYM {} + | TEXT_SYM {} + | THAN_SYM {} + | TRANSACTION_SYM {} + | TRIGGERS_SYM {} + | TIMESTAMP {} + | TIMESTAMP_ADD {} + | TIMESTAMP_DIFF {} + | TIME_SYM {} + | TYPES_SYM {} + | TYPE_SYM {} + | UDF_RETURNS_SYM {} + | FUNCTION_SYM {} + | UNCOMMITTED_SYM {} + | UNDEFINED_SYM {} + | UNDO_BUFFER_SIZE_SYM {} + | UNDOFILE_SYM {} + | UNKNOWN_SYM {} + | UNTIL_SYM {} + | USER {} + | USE_FRM {} + | VARIABLES {} + | VIEW_SYM {} + | VALUE_SYM {} + | WARNINGS {} + | WAIT_SYM {} + | WEEK_SYM {} + | WORK_SYM {} + | X509_SYM {} + | YEAR_SYM {} + ; /* Option functions */ set: - SET opt_option - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SET_OPTION; - mysql_init_select(lex); - lex->option_type=OPT_SESSION; - lex->var_list.empty(); - lex->one_shot_set= 0; - } - option_value_list - {} - ; + SET opt_option + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SET_OPTION; + mysql_init_select(lex); + lex->option_type=OPT_SESSION; + lex->var_list.empty(); + lex->one_shot_set= 0; + } + option_value_list + {} + ; opt_option: - /* empty */ {} - | OPTION {}; + /* empty */ {} + | OPTION {} + ; option_value_list: - option_type_value - | option_value_list ',' option_type_value; + option_type_value + | option_value_list ',' option_type_value + ; option_type_value: - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; - - if (lex->sphead) { - /* - If we are in SP we want have own LEX for each assignment. - This is mostly because it is hard for several sp_instr_set - and sp_instr_set_trigger instructions share one LEX. - (Well, it is theoretically possible but adds some extra - overhead on preparation for execution stage and IMO less - robust). + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; - QQ: May be we should simply prohibit group assignments in SP? - */ - lex->sphead->reset_lex(thd); - lex= thd->lex; - - /* Set new LEX as if we at start of set rule. */ - lex->sql_command= SQLCOM_SET_OPTION; - mysql_init_select(lex); - lex->option_type=OPT_SESSION; - lex->var_list.empty(); - lex->one_shot_set= 0; - lex->sphead->m_tmp_query= lip->get_tok_start(); - } - } - ext_option_value - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; - - if (lex->sphead) - { - sp_head *sp= lex->sphead; - - if (!lex->var_list.is_empty()) - { + if (lex->sphead) + { /* - We have assignment to user or system variable or - option setting, so we should construct sp_instr_stmt - for it. + If we are in SP we want have own LEX for each assignment. + This is mostly because it is hard for several sp_instr_set + and sp_instr_set_trigger instructions share one LEX. + (Well, it is theoretically possible but adds some extra + overhead on preparation for execution stage and IMO less + robust). + + QQ: May be we should simply prohibit group assignments in SP? */ - LEX_STRING qbuff; - sp_instr_stmt *i; + lex->sphead->reset_lex(thd); + lex= thd->lex; - if (!(i= new sp_instr_stmt(sp->instructions(), lex->spcont, - lex))) - MYSQL_YYABORT; - - /* - Extract the query statement from the tokenizer. The - end is either lip->ptr, if there was no lookahead, - lip->tok_end otherwise. - */ - if (yychar == YYEMPTY) - qbuff.length= lip->get_ptr() - sp->m_tmp_query; - else - qbuff.length= lip->get_tok_end() - sp->m_tmp_query; - - if (!(qbuff.str= (char*) alloc_root(thd->mem_root, - qbuff.length + 5))) - MYSQL_YYABORT; - - strmake(strmake(qbuff.str, "SET ", 4), sp->m_tmp_query, - qbuff.length); - qbuff.length+= 4; - i->m_query= qbuff; - sp->add_instr(i); + /* Set new LEX as if we at start of set rule. */ + lex->sql_command= SQLCOM_SET_OPTION; + mysql_init_select(lex); + lex->option_type=OPT_SESSION; + lex->var_list.empty(); + lex->one_shot_set= 0; + lex->sphead->m_tmp_query= lip->get_tok_start(); } - lex->sphead->restore_lex(thd); } - }; + ext_option_value + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; + + if (lex->sphead) + { + sp_head *sp= lex->sphead; + + if (!lex->var_list.is_empty()) + { + /* + We have assignment to user or system variable or + option setting, so we should construct sp_instr_stmt + for it. + */ + LEX_STRING qbuff; + sp_instr_stmt *i; + + if (!(i= new sp_instr_stmt(sp->instructions(), lex->spcont, + lex))) + MYSQL_YYABORT; + + /* + Extract the query statement from the tokenizer. The + end is either lip->ptr, if there was no lookahead, + lip->tok_end otherwise. + */ + if (yychar == YYEMPTY) + qbuff.length= lip->get_ptr() - sp->m_tmp_query; + else + qbuff.length= lip->get_tok_end() - sp->m_tmp_query; + + if (!(qbuff.str= (char*) alloc_root(thd->mem_root, + qbuff.length + 5))) + MYSQL_YYABORT; + + strmake(strmake(qbuff.str, "SET ", 4), sp->m_tmp_query, + qbuff.length); + qbuff.length+= 4; + i->m_query= qbuff; + sp->add_instr(i); + } + lex->sphead->restore_lex(thd); + } + } + ; option_type: - option_type2 {} - | GLOBAL_SYM { $$=OPT_GLOBAL; } - | LOCAL_SYM { $$=OPT_SESSION; } - | SESSION_SYM { $$=OPT_SESSION; } - ; + option_type2 {} + | GLOBAL_SYM { $$=OPT_GLOBAL; } + | LOCAL_SYM { $$=OPT_SESSION; } + | SESSION_SYM { $$=OPT_SESSION; } + ; option_type2: - /* empty */ { $$= OPT_DEFAULT; } - | ONE_SHOT_SYM { Lex->one_shot_set= 1; $$= OPT_SESSION; } - ; + /* empty */ { $$= OPT_DEFAULT; } + | ONE_SHOT_SYM { Lex->one_shot_set= 1; $$= OPT_SESSION; } + ; opt_var_type: - /* empty */ { $$=OPT_SESSION; } - | GLOBAL_SYM { $$=OPT_GLOBAL; } - | LOCAL_SYM { $$=OPT_SESSION; } - | SESSION_SYM { $$=OPT_SESSION; } - ; + /* empty */ { $$=OPT_SESSION; } + | GLOBAL_SYM { $$=OPT_GLOBAL; } + | LOCAL_SYM { $$=OPT_SESSION; } + | SESSION_SYM { $$=OPT_SESSION; } + ; opt_var_ident_type: - /* empty */ { $$=OPT_DEFAULT; } - | GLOBAL_SYM '.' { $$=OPT_GLOBAL; } - | LOCAL_SYM '.' { $$=OPT_SESSION; } - | SESSION_SYM '.' { $$=OPT_SESSION; } - ; + /* empty */ { $$=OPT_DEFAULT; } + | GLOBAL_SYM '.' { $$=OPT_GLOBAL; } + | LOCAL_SYM '.' { $$=OPT_SESSION; } + | SESSION_SYM '.' { $$=OPT_SESSION; } + ; ext_option_value: - sys_option_value - | option_type2 option_value; + sys_option_value + | option_type2 option_value + ; sys_option_value: - option_type internal_variable_name equal set_expr_or_default - { - LEX *lex=Lex; - - if ($2.var == trg_new_row_fake_var) + option_type internal_variable_name equal set_expr_or_default { - /* We are in trigger and assigning value to field of new row */ - Item *it; - Item_trigger_field *trg_fld; - sp_instr_set_trigger_field *sp_fld; - LINT_INIT(sp_fld); - if ($1) + LEX *lex=Lex; + + if ($2.var == trg_new_row_fake_var) { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; + /* We are in trigger and assigning value to field of new row */ + Item *it; + Item_trigger_field *trg_fld; + sp_instr_set_trigger_field *sp_fld; + LINT_INIT(sp_fld); + if ($1) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + if ($4) + it= $4; + else + { + /* QQ: Shouldn't this be field's default value ? */ + it= new Item_null(); + } + + DBUG_ASSERT(lex->trg_chistics.action_time == TRG_ACTION_BEFORE && + (lex->trg_chistics.event == TRG_EVENT_INSERT || + lex->trg_chistics.event == TRG_EVENT_UPDATE)); + if (!(trg_fld= new Item_trigger_field(Lex->current_context(), + Item_trigger_field::NEW_ROW, + $2.base_name.str, + UPDATE_ACL, FALSE)) || + !(sp_fld= new sp_instr_set_trigger_field(lex->sphead-> + instructions(), + lex->spcont, + trg_fld, + it, lex))) + MYSQL_YYABORT; + + /* + Let us add this item to list of all Item_trigger_field + objects in trigger. + */ + lex->trg_table_fields.link_in_list((uchar *)trg_fld, + (uchar **) &trg_fld-> + next_trg_field); + + lex->sphead->add_instr(sp_fld); + } + else if ($2.var) + { /* System variable */ + if ($1) + lex->option_type= $1; + lex->var_list.push_back(new set_var(lex->option_type, $2.var, + &$2.base_name, $4)); } - if ($4) - it= $4; else { - /* QQ: Shouldn't this be field's default value ? */ - it= new Item_null(); + /* An SP local variable */ + sp_pcontext *ctx= lex->spcont; + sp_variable_t *spv; + sp_instr_set *sp_set; + Item *it; + if ($1) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + + spv= ctx->find_variable(&$2.base_name); + + if ($4) + it= $4; + else if (spv->dflt) + it= spv->dflt; + else + it= new Item_null(); + sp_set= new sp_instr_set(lex->sphead->instructions(), ctx, + spv->offset, it, spv->type, lex, TRUE); + lex->sphead->add_instr(sp_set); } - - DBUG_ASSERT(lex->trg_chistics.action_time == TRG_ACTION_BEFORE && - (lex->trg_chistics.event == TRG_EVENT_INSERT || - lex->trg_chistics.event == TRG_EVENT_UPDATE)); - if (!(trg_fld= new Item_trigger_field(Lex->current_context(), - Item_trigger_field::NEW_ROW, - $2.base_name.str, - UPDATE_ACL, FALSE)) || - !(sp_fld= new sp_instr_set_trigger_field(lex->sphead-> - instructions(), - lex->spcont, - trg_fld, - it, lex))) - MYSQL_YYABORT; - - /* - Let us add this item to list of all Item_trigger_field - objects in trigger. - */ - lex->trg_table_fields.link_in_list((uchar *)trg_fld, - (uchar **) &trg_fld-> - next_trg_field); - - lex->sphead->add_instr(sp_fld); } - else if ($2.var) - { /* System variable */ - if ($1) - lex->option_type= $1; - lex->var_list.push_back(new set_var(lex->option_type, $2.var, - &$2.base_name, $4)); - } - else - { - /* An SP local variable */ - sp_pcontext *ctx= lex->spcont; - sp_variable_t *spv; - sp_instr_set *sp_set; - Item *it; - if ($1) - { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } - - spv= ctx->find_variable(&$2.base_name); - - if ($4) - it= $4; - else if (spv->dflt) - it= spv->dflt; - else - it= new Item_null(); - sp_set= new sp_instr_set(lex->sphead->instructions(), ctx, - spv->offset, it, spv->type, lex, TRUE); - lex->sphead->add_instr(sp_set); - } - } | option_type TRANSACTION_SYM ISOLATION LEVEL_SYM isolation_types - { - LEX *lex=Lex; - lex->option_type= $1; - lex->var_list.push_back(new set_var(lex->option_type, - find_sys_var(YYTHD, "tx_isolation"), - &null_lex_str, - new Item_int((int32) $5))); - } + { + LEX *lex=Lex; + lex->option_type= $1; + lex->var_list.push_back(new set_var(lex->option_type, + find_sys_var(YYTHD, "tx_isolation"), + &null_lex_str, + new Item_int((int32) $5))); + } ; option_value: - '@' ident_or_text equal expr - { - Lex->var_list.push_back(new set_var_user(new Item_func_set_user_var($2,$4))); - } - | '@' '@' opt_var_ident_type internal_variable_name equal set_expr_or_default - { - LEX *lex=Lex; - lex->var_list.push_back(new set_var($3, $4.var, &$4.base_name, $6)); - } - | charset old_or_new_charset_name_or_default - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - $2= $2 ? $2: global_system_variables.character_set_client; - lex->var_list.push_back(new set_var_collation_client($2,thd->variables.collation_database,$2)); - } + '@' ident_or_text equal expr + { + Lex->var_list.push_back(new set_var_user(new Item_func_set_user_var($2,$4))); + } + | '@' '@' opt_var_ident_type internal_variable_name equal set_expr_or_default + { + LEX *lex=Lex; + lex->var_list.push_back(new set_var($3, $4.var, &$4.base_name, $6)); + } + | charset old_or_new_charset_name_or_default + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + $2= $2 ? $2: global_system_variables.character_set_client; + lex->var_list.push_back(new set_var_collation_client($2,thd->variables.collation_database,$2)); + } | NAMES_SYM equal expr - { - LEX *lex= Lex; + { + LEX *lex= Lex; sp_pcontext *spc= lex->spcont; - LEX_STRING names; + LEX_STRING names; - names.str= (char *)"names"; - names.length= 5; - if (spc && spc->find_variable(&names)) + names.str= (char *)"names"; + names.length= 5; + if (spc && spc->find_variable(&names)) my_error(ER_SP_BAD_VAR_SHADOW, MYF(0), names.str); else my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } - | NAMES_SYM charset_name_or_default opt_collate - { - LEX *lex= Lex; - $2= $2 ? $2 : global_system_variables.character_set_client; - $3= $3 ? $3 : $2; - if (!my_charset_same($2,$3)) - { - my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0), - $3->name, $2->csname); - MYSQL_YYABORT; - } - lex->var_list.push_back(new set_var_collation_client($3,$3,$3)); - } - | PASSWORD equal text_or_password - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - LEX_USER *user; + MYSQL_YYABORT; + } + | NAMES_SYM charset_name_or_default opt_collate + { + LEX *lex= Lex; + $2= $2 ? $2 : global_system_variables.character_set_client; + $3= $3 ? $3 : $2; + if (!my_charset_same($2,$3)) + { + my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0), + $3->name, $2->csname); + MYSQL_YYABORT; + } + lex->var_list.push_back(new set_var_collation_client($3,$3,$3)); + } + | PASSWORD equal text_or_password + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + LEX_USER *user; sp_pcontext *spc= lex->spcont; - LEX_STRING pw; + LEX_STRING pw; - pw.str= (char *)"password"; - pw.length= 8; - if (spc && spc->find_variable(&pw)) - { + pw.str= (char *)"password"; + pw.length= 8; + if (spc && spc->find_variable(&pw)) + { my_error(ER_SP_BAD_VAR_SHADOW, MYF(0), pw.str); - MYSQL_YYABORT; - } - if (!(user=(LEX_USER*) thd->alloc(sizeof(LEX_USER)))) - MYSQL_YYABORT; - user->host=null_lex_str; - user->user.str=thd->security_ctx->priv_user; - thd->lex->var_list.push_back(new set_var_password(user, $3)); - } - | PASSWORD FOR_SYM user equal text_or_password - { - Lex->var_list.push_back(new set_var_password($3,$5)); - } - ; + MYSQL_YYABORT; + } + if (!(user=(LEX_USER*) thd->alloc(sizeof(LEX_USER)))) + MYSQL_YYABORT; + user->host=null_lex_str; + user->user.str=thd->security_ctx->priv_user; + thd->lex->var_list.push_back(new set_var_password(user, $3)); + } + | PASSWORD FOR_SYM user equal text_or_password + { + Lex->var_list.push_back(new set_var_password($3,$5)); + } + ; internal_variable_name: - ident - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - sp_pcontext *spc= lex->spcont; - sp_variable_t *spv; + ident + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + sp_pcontext *spc= lex->spcont; + sp_variable_t *spv; - /* We have to lookup here since local vars can shadow sysvars */ - if (!spc || !(spv = spc->find_variable(&$1))) - { - /* Not an SP local variable */ - sys_var *tmp=find_sys_var(thd, $1.str, $1.length); - if (!tmp) - MYSQL_YYABORT; - $$.var= tmp; - $$.base_name= null_lex_str; - if (spc && tmp == &sys_autocommit) + /* We have to lookup here since local vars can shadow sysvars */ + if (!spc || !(spv = spc->find_variable(&$1))) { - /* - We don't allow setting AUTOCOMMIT from a stored function - or trigger. - */ - lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; + /* Not an SP local variable */ + sys_var *tmp=find_sys_var(thd, $1.str, $1.length); + if (!tmp) + MYSQL_YYABORT; + $$.var= tmp; + $$.base_name= null_lex_str; + if (spc && tmp == &sys_autocommit) + { + /* + We don't allow setting AUTOCOMMIT from a stored function + or trigger. + */ + lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; + } } - } - else - { - /* An SP local variable */ - $$.var= NULL; - $$.base_name= $1; - } - } - | ident '.' ident - { + else + { + /* An SP local variable */ + $$.var= NULL; + $$.base_name= $1; + } + } + | ident '.' ident + { LEX *lex= Lex; if (check_reserved_words(&$1)) { @@ -10542,522 +10971,533 @@ internal_variable_name: $$.var= tmp; $$.base_name= $1; } - } - | DEFAULT '.' ident - { - sys_var *tmp=find_sys_var(YYTHD, $3.str, $3.length); - if (!tmp) - MYSQL_YYABORT; - if (!tmp->is_struct()) - my_error(ER_VARIABLE_IS_NOT_STRUCT, MYF(0), $3.str); - $$.var= tmp; - $$.base_name.str= (char*) "default"; - $$.base_name.length= 7; - } + } + | DEFAULT '.' ident + { + sys_var *tmp=find_sys_var(YYTHD, $3.str, $3.length); + if (!tmp) + MYSQL_YYABORT; + if (!tmp->is_struct()) + my_error(ER_VARIABLE_IS_NOT_STRUCT, MYF(0), $3.str); + $$.var= tmp; + $$.base_name.str= (char*) "default"; + $$.base_name.length= 7; + } ; isolation_types: - READ_SYM UNCOMMITTED_SYM { $$= ISO_READ_UNCOMMITTED; } - | READ_SYM COMMITTED_SYM { $$= ISO_READ_COMMITTED; } - | REPEATABLE_SYM READ_SYM { $$= ISO_REPEATABLE_READ; } - | SERIALIZABLE_SYM { $$= ISO_SERIALIZABLE; } - ; + READ_SYM UNCOMMITTED_SYM { $$= ISO_READ_UNCOMMITTED; } + | READ_SYM COMMITTED_SYM { $$= ISO_READ_COMMITTED; } + | REPEATABLE_SYM READ_SYM { $$= ISO_REPEATABLE_READ; } + | SERIALIZABLE_SYM { $$= ISO_SERIALIZABLE; } + ; text_or_password: - TEXT_STRING { $$=$1.str;} - | PASSWORD '(' TEXT_STRING ')' - { - $$= $3.length ? YYTHD->variables.old_passwords ? - Item_func_old_password::alloc(YYTHD, $3.str) : - Item_func_password::alloc(YYTHD, $3.str) : - $3.str; - } - | OLD_PASSWORD '(' TEXT_STRING ')' - { - $$= $3.length ? Item_func_old_password::alloc(YYTHD, $3.str) : - $3.str; - } - ; + TEXT_STRING { $$=$1.str;} + | PASSWORD '(' TEXT_STRING ')' + { + $$= $3.length ? YYTHD->variables.old_passwords ? + Item_func_old_password::alloc(YYTHD, $3.str) : + Item_func_password::alloc(YYTHD, $3.str) : + $3.str; + } + | OLD_PASSWORD '(' TEXT_STRING ')' + { + $$= $3.length ? Item_func_old_password::alloc(YYTHD, $3.str) : + $3.str; + } + ; set_expr_or_default: - expr { $$=$1; } - | DEFAULT { $$=0; } - | ON { $$=new Item_string("ON", 2, system_charset_info); } - | ALL { $$=new Item_string("ALL", 3, system_charset_info); } - | BINARY { $$=new Item_string("binary", 6, system_charset_info); } - ; - + expr { $$=$1; } + | DEFAULT { $$=0; } + | ON { $$=new Item_string("ON", 2, system_charset_info); } + | ALL { $$=new Item_string("ALL", 3, system_charset_info); } + | BINARY { $$=new Item_string("binary", 6, system_charset_info); } + ; /* Lock function */ lock: - LOCK_SYM table_or_tables - { - LEX *lex= Lex; + LOCK_SYM table_or_tables + { + LEX *lex= Lex; - if (lex->sphead) - { - my_error(ER_SP_BADSTATEMENT, MYF(0), "LOCK"); - MYSQL_YYABORT; - } - lex->sql_command= SQLCOM_LOCK_TABLES; - } - table_lock_list - {} - ; + if (lex->sphead) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), "LOCK"); + MYSQL_YYABORT; + } + lex->sql_command= SQLCOM_LOCK_TABLES; + } + table_lock_list + {} + ; table_or_tables: - TABLE_SYM - | TABLES; + TABLE_SYM + | TABLES + ; table_lock_list: - table_lock - | table_lock_list ',' table_lock; + table_lock + | table_lock_list ',' table_lock + ; table_lock: - table_ident opt_table_alias lock_option - { - if (!Select->add_table_to_list(YYTHD, $1, $2, 0, (thr_lock_type) $3)) - MYSQL_YYABORT; - } + table_ident opt_table_alias lock_option + { + if (!Select->add_table_to_list(YYTHD, $1, $2, 0, (thr_lock_type) $3)) + MYSQL_YYABORT; + } ; lock_option: - READ_SYM { $$=TL_READ_NO_INSERT; } - | WRITE_SYM { $$=TL_WRITE_DEFAULT; } - | LOW_PRIORITY WRITE_SYM { $$=TL_WRITE_LOW_PRIORITY; } - | READ_SYM LOCAL_SYM { $$= TL_READ; } + READ_SYM { $$= TL_READ_NO_INSERT; } + | WRITE_SYM { $$= TL_WRITE_DEFAULT; } + | LOW_PRIORITY WRITE_SYM { $$= TL_WRITE_LOW_PRIORITY; } + | READ_SYM LOCAL_SYM { $$= TL_READ; } ; unlock: - UNLOCK_SYM - { - LEX *lex= Lex; + UNLOCK_SYM + { + LEX *lex= Lex; - if (lex->sphead) - { - my_error(ER_SP_BADSTATEMENT, MYF(0), "UNLOCK"); - MYSQL_YYABORT; - } - lex->sql_command= SQLCOM_UNLOCK_TABLES; - } - table_or_tables - {} + if (lex->sphead) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), "UNLOCK"); + MYSQL_YYABORT; + } + lex->sql_command= SQLCOM_UNLOCK_TABLES; + } + table_or_tables + {} ; - /* ** Handler: direct access to ISAM functions */ handler: - HANDLER_SYM table_ident OPEN_SYM opt_table_alias - { - LEX *lex= Lex; - if (lex->sphead) - { - my_error(ER_SP_BADSTATEMENT, MYF(0), "HANDLER"); - MYSQL_YYABORT; - } - lex->sql_command = SQLCOM_HA_OPEN; - if (!lex->current_select->add_table_to_list(lex->thd, $2, $4, 0)) - MYSQL_YYABORT; - } - | HANDLER_SYM table_ident_nodb CLOSE_SYM - { - LEX *lex= Lex; - if (lex->sphead) - { - my_error(ER_SP_BADSTATEMENT, MYF(0), "HANDLER"); - MYSQL_YYABORT; - } - lex->sql_command = SQLCOM_HA_CLOSE; - if (!lex->current_select->add_table_to_list(lex->thd, $2, 0, 0)) - MYSQL_YYABORT; - } - | HANDLER_SYM table_ident_nodb READ_SYM - { - LEX *lex=Lex; - if (lex->sphead) - { - my_error(ER_SP_BADSTATEMENT, MYF(0), "HANDLER"); - MYSQL_YYABORT; - } - lex->expr_allows_subselect= FALSE; - lex->sql_command = SQLCOM_HA_READ; - lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */ - lex->current_select->select_limit= new Item_int((int32) 1); - lex->current_select->offset_limit= 0; - if (!lex->current_select->add_table_to_list(lex->thd, $2, 0, 0)) - MYSQL_YYABORT; - } - handler_read_or_scan where_clause opt_limit_clause - { - Lex->expr_allows_subselect= TRUE; - } + HANDLER_SYM table_ident OPEN_SYM opt_table_alias + { + LEX *lex= Lex; + if (lex->sphead) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), "HANDLER"); + MYSQL_YYABORT; + } + lex->sql_command = SQLCOM_HA_OPEN; + if (!lex->current_select->add_table_to_list(lex->thd, $2, $4, 0)) + MYSQL_YYABORT; + } + | HANDLER_SYM table_ident_nodb CLOSE_SYM + { + LEX *lex= Lex; + if (lex->sphead) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), "HANDLER"); + MYSQL_YYABORT; + } + lex->sql_command = SQLCOM_HA_CLOSE; + if (!lex->current_select->add_table_to_list(lex->thd, $2, 0, 0)) + MYSQL_YYABORT; + } + | HANDLER_SYM table_ident_nodb READ_SYM + { + LEX *lex=Lex; + if (lex->sphead) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), "HANDLER"); + MYSQL_YYABORT; + } + lex->expr_allows_subselect= FALSE; + lex->sql_command = SQLCOM_HA_READ; + lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */ + lex->current_select->select_limit= new Item_int((int32) 1); + lex->current_select->offset_limit= 0; + if (!lex->current_select->add_table_to_list(lex->thd, $2, 0, 0)) + MYSQL_YYABORT; + } + handler_read_or_scan where_clause opt_limit_clause + { + Lex->expr_allows_subselect= TRUE; + } ; handler_read_or_scan: - handler_scan_function { Lex->ident= null_lex_str; } + handler_scan_function { Lex->ident= null_lex_str; } | ident handler_rkey_function { Lex->ident= $1; } ; handler_scan_function: - FIRST_SYM { Lex->ha_read_mode = RFIRST; } - | NEXT_SYM { Lex->ha_read_mode = RNEXT; } + FIRST_SYM { Lex->ha_read_mode = RFIRST; } + | NEXT_SYM { Lex->ha_read_mode = RNEXT; } ; handler_rkey_function: - FIRST_SYM { Lex->ha_read_mode = RFIRST; } - | NEXT_SYM { Lex->ha_read_mode = RNEXT; } - | PREV_SYM { Lex->ha_read_mode = RPREV; } - | LAST_SYM { Lex->ha_read_mode = RLAST; } - | handler_rkey_mode - { - LEX *lex=Lex; - lex->ha_read_mode = RKEY; - lex->ha_rkey_mode=$1; - if (!(lex->insert_list = new List_item)) - MYSQL_YYABORT; - } '(' values ')' { } + FIRST_SYM { Lex->ha_read_mode = RFIRST; } + | NEXT_SYM { Lex->ha_read_mode = RNEXT; } + | PREV_SYM { Lex->ha_read_mode = RPREV; } + | LAST_SYM { Lex->ha_read_mode = RLAST; } + | handler_rkey_mode + { + LEX *lex=Lex; + lex->ha_read_mode = RKEY; + lex->ha_rkey_mode=$1; + if (!(lex->insert_list = new List_item)) + MYSQL_YYABORT; + } + '(' values ')' + {} ; handler_rkey_mode: - EQ { $$=HA_READ_KEY_EXACT; } - | GE { $$=HA_READ_KEY_OR_NEXT; } - | LE { $$=HA_READ_KEY_OR_PREV; } - | GT_SYM { $$=HA_READ_AFTER_KEY; } - | LT { $$=HA_READ_BEFORE_KEY; } + EQ { $$=HA_READ_KEY_EXACT; } + | GE { $$=HA_READ_KEY_OR_NEXT; } + | LE { $$=HA_READ_KEY_OR_PREV; } + | GT_SYM { $$=HA_READ_AFTER_KEY; } + | LT { $$=HA_READ_BEFORE_KEY; } ; /* GRANT / REVOKE */ revoke: - REVOKE clear_privileges revoke_command - {} + REVOKE clear_privileges revoke_command + {} ; revoke_command: - grant_privileges ON opt_table grant_ident FROM grant_list - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_REVOKE; - lex->type= 0; - } - | - grant_privileges ON FUNCTION_SYM grant_ident FROM grant_list - { - LEX *lex= Lex; - if (lex->columns.elements) + grant_privileges ON opt_table grant_ident FROM grant_list { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; + LEX *lex= Lex; + lex->sql_command= SQLCOM_REVOKE; + lex->type= 0; } - lex->sql_command= SQLCOM_REVOKE; - lex->type= TYPE_ENUM_FUNCTION; - - } - | - grant_privileges ON PROCEDURE grant_ident FROM grant_list - { - LEX *lex= Lex; - if (lex->columns.elements) + | grant_privileges ON FUNCTION_SYM grant_ident FROM grant_list { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; + LEX *lex= Lex; + if (lex->columns.elements) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + lex->sql_command= SQLCOM_REVOKE; + lex->type= TYPE_ENUM_FUNCTION; } - lex->sql_command= SQLCOM_REVOKE; - lex->type= TYPE_ENUM_PROCEDURE; - } - | - ALL opt_privileges ',' GRANT OPTION FROM grant_list - { - Lex->sql_command = SQLCOM_REVOKE_ALL; - } - ; + | grant_privileges ON PROCEDURE grant_ident FROM grant_list + { + LEX *lex= Lex; + if (lex->columns.elements) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + lex->sql_command= SQLCOM_REVOKE; + lex->type= TYPE_ENUM_PROCEDURE; + } + | ALL opt_privileges ',' GRANT OPTION FROM grant_list + { + Lex->sql_command = SQLCOM_REVOKE_ALL; + } + ; grant: - GRANT clear_privileges grant_command - {} + GRANT clear_privileges grant_command + {} ; grant_command: - grant_privileges ON opt_table grant_ident TO_SYM grant_list - require_clause grant_options - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_GRANT; - lex->type= 0; - } - | - grant_privileges ON FUNCTION_SYM grant_ident TO_SYM grant_list - require_clause grant_options - { - LEX *lex= Lex; - if (lex->columns.elements) + grant_privileges ON opt_table grant_ident TO_SYM grant_list + require_clause grant_options { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; + LEX *lex= Lex; + lex->sql_command= SQLCOM_GRANT; + lex->type= 0; } - lex->sql_command= SQLCOM_GRANT; - lex->type= TYPE_ENUM_FUNCTION; - } - | - grant_privileges ON PROCEDURE grant_ident TO_SYM grant_list - require_clause grant_options - { - LEX *lex= Lex; - if (lex->columns.elements) + | grant_privileges ON FUNCTION_SYM grant_ident TO_SYM grant_list + require_clause grant_options { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; + LEX *lex= Lex; + if (lex->columns.elements) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + lex->sql_command= SQLCOM_GRANT; + lex->type= TYPE_ENUM_FUNCTION; + } + | grant_privileges ON PROCEDURE grant_ident TO_SYM grant_list + require_clause grant_options + { + LEX *lex= Lex; + if (lex->columns.elements) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + lex->sql_command= SQLCOM_GRANT; + lex->type= TYPE_ENUM_PROCEDURE; } - lex->sql_command= SQLCOM_GRANT; - lex->type= TYPE_ENUM_PROCEDURE; - } ; opt_table: - /* Empty */ - | TABLE_SYM ; - + /* Empty */ + | TABLE_SYM + ; + grant_privileges: - object_privilege_list { } - | ALL opt_privileges - { - Lex->all_privileges= 1; - Lex->grant= GLOBAL_ACLS; - } + object_privilege_list {} + | ALL opt_privileges + { + Lex->all_privileges= 1; + Lex->grant= GLOBAL_ACLS; + } ; opt_privileges: - /* empty */ - | PRIVILEGES - ; + /* empty */ + | PRIVILEGES + ; object_privilege_list: - object_privilege - | object_privilege_list ',' object_privilege; + object_privilege + | object_privilege_list ',' object_privilege + ; object_privilege: - SELECT_SYM { Lex->which_columns = SELECT_ACL;} opt_column_list {} - | INSERT { Lex->which_columns = INSERT_ACL;} opt_column_list {} - | UPDATE_SYM { Lex->which_columns = UPDATE_ACL; } opt_column_list {} - | REFERENCES { Lex->which_columns = REFERENCES_ACL;} opt_column_list {} - | DELETE_SYM { Lex->grant |= DELETE_ACL;} - | USAGE {} - | INDEX_SYM { Lex->grant |= INDEX_ACL;} - | ALTER { Lex->grant |= ALTER_ACL;} - | CREATE { Lex->grant |= CREATE_ACL;} - | DROP { Lex->grant |= DROP_ACL;} - | EXECUTE_SYM { Lex->grant |= EXECUTE_ACL;} - | RELOAD { Lex->grant |= RELOAD_ACL;} - | SHUTDOWN { Lex->grant |= SHUTDOWN_ACL;} - | PROCESS { Lex->grant |= PROCESS_ACL;} - | FILE_SYM { Lex->grant |= FILE_ACL;} - | GRANT OPTION { Lex->grant |= GRANT_ACL;} - | SHOW DATABASES { Lex->grant |= SHOW_DB_ACL;} - | SUPER_SYM { Lex->grant |= SUPER_ACL;} - | CREATE TEMPORARY TABLES { Lex->grant |= CREATE_TMP_ACL;} - | LOCK_SYM TABLES { Lex->grant |= LOCK_TABLES_ACL; } - | REPLICATION SLAVE { Lex->grant |= REPL_SLAVE_ACL; } - | REPLICATION CLIENT_SYM { Lex->grant |= REPL_CLIENT_ACL; } - | CREATE VIEW_SYM { Lex->grant |= CREATE_VIEW_ACL; } - | SHOW VIEW_SYM { Lex->grant |= SHOW_VIEW_ACL; } - | CREATE ROUTINE_SYM { Lex->grant |= CREATE_PROC_ACL; } - | ALTER ROUTINE_SYM { Lex->grant |= ALTER_PROC_ACL; } - | CREATE USER { Lex->grant |= CREATE_USER_ACL; } - | EVENT_SYM { Lex->grant |= EVENT_ACL;} - | TRIGGER_SYM { Lex->grant |= TRIGGER_ACL; } - ; - + SELECT_SYM + { Lex->which_columns = SELECT_ACL;} + opt_column_list {} + | INSERT + { Lex->which_columns = INSERT_ACL;} + opt_column_list {} + | UPDATE_SYM + { Lex->which_columns = UPDATE_ACL; } + opt_column_list {} + | REFERENCES + { Lex->which_columns = REFERENCES_ACL;} + opt_column_list {} + | DELETE_SYM { Lex->grant |= DELETE_ACL;} + | USAGE {} + | INDEX_SYM { Lex->grant |= INDEX_ACL;} + | ALTER { Lex->grant |= ALTER_ACL;} + | CREATE { Lex->grant |= CREATE_ACL;} + | DROP { Lex->grant |= DROP_ACL;} + | EXECUTE_SYM { Lex->grant |= EXECUTE_ACL;} + | RELOAD { Lex->grant |= RELOAD_ACL;} + | SHUTDOWN { Lex->grant |= SHUTDOWN_ACL;} + | PROCESS { Lex->grant |= PROCESS_ACL;} + | FILE_SYM { Lex->grant |= FILE_ACL;} + | GRANT OPTION { Lex->grant |= GRANT_ACL;} + | SHOW DATABASES { Lex->grant |= SHOW_DB_ACL;} + | SUPER_SYM { Lex->grant |= SUPER_ACL;} + | CREATE TEMPORARY TABLES { Lex->grant |= CREATE_TMP_ACL;} + | LOCK_SYM TABLES { Lex->grant |= LOCK_TABLES_ACL; } + | REPLICATION SLAVE { Lex->grant |= REPL_SLAVE_ACL; } + | REPLICATION CLIENT_SYM { Lex->grant |= REPL_CLIENT_ACL; } + | CREATE VIEW_SYM { Lex->grant |= CREATE_VIEW_ACL; } + | SHOW VIEW_SYM { Lex->grant |= SHOW_VIEW_ACL; } + | CREATE ROUTINE_SYM { Lex->grant |= CREATE_PROC_ACL; } + | ALTER ROUTINE_SYM { Lex->grant |= ALTER_PROC_ACL; } + | CREATE USER { Lex->grant |= CREATE_USER_ACL; } + | EVENT_SYM { Lex->grant |= EVENT_ACL;} + | TRIGGER_SYM { Lex->grant |= TRIGGER_ACL; } + ; opt_and: - /* empty */ {} - | AND_SYM {} - ; + /* empty */ {} + | AND_SYM {} + ; require_list: - require_list_element opt_and require_list - | require_list_element - ; + require_list_element opt_and require_list + | require_list_element + ; require_list_element: - SUBJECT_SYM TEXT_STRING - { - LEX *lex=Lex; - if (lex->x509_subject) - { - my_error(ER_DUP_ARGUMENT, MYF(0), "SUBJECT"); - MYSQL_YYABORT; - } - lex->x509_subject=$2.str; - } - | ISSUER_SYM TEXT_STRING - { - LEX *lex=Lex; - if (lex->x509_issuer) - { - my_error(ER_DUP_ARGUMENT, MYF(0), "ISSUER"); - MYSQL_YYABORT; - } - lex->x509_issuer=$2.str; - } - | CIPHER_SYM TEXT_STRING - { - LEX *lex=Lex; - if (lex->ssl_cipher) - { - my_error(ER_DUP_ARGUMENT, MYF(0), "CIPHER"); - MYSQL_YYABORT; - } - lex->ssl_cipher=$2.str; - } - ; + SUBJECT_SYM TEXT_STRING + { + LEX *lex=Lex; + if (lex->x509_subject) + { + my_error(ER_DUP_ARGUMENT, MYF(0), "SUBJECT"); + MYSQL_YYABORT; + } + lex->x509_subject=$2.str; + } + | ISSUER_SYM TEXT_STRING + { + LEX *lex=Lex; + if (lex->x509_issuer) + { + my_error(ER_DUP_ARGUMENT, MYF(0), "ISSUER"); + MYSQL_YYABORT; + } + lex->x509_issuer=$2.str; + } + | CIPHER_SYM TEXT_STRING + { + LEX *lex=Lex; + if (lex->ssl_cipher) + { + my_error(ER_DUP_ARGUMENT, MYF(0), "CIPHER"); + MYSQL_YYABORT; + } + lex->ssl_cipher=$2.str; + } + ; grant_ident: - '*' - { - LEX *lex= Lex; + '*' + { + LEX *lex= Lex; size_t dummy; if (lex->copy_db_to(&lex->current_select->db, &dummy)) MYSQL_YYABORT; - if (lex->grant == GLOBAL_ACLS) - lex->grant = DB_ACLS & ~GRANT_ACL; - else if (lex->columns.elements) - { - my_message(ER_ILLEGAL_GRANT_FOR_TABLE, + if (lex->grant == GLOBAL_ACLS) + lex->grant = DB_ACLS & ~GRANT_ACL; + else if (lex->columns.elements) + { + my_message(ER_ILLEGAL_GRANT_FOR_TABLE, ER(ER_ILLEGAL_GRANT_FOR_TABLE), MYF(0)); - MYSQL_YYABORT; - } - } - | ident '.' '*' - { - LEX *lex= Lex; - lex->current_select->db = $1.str; - if (lex->grant == GLOBAL_ACLS) - lex->grant = DB_ACLS & ~GRANT_ACL; - else if (lex->columns.elements) - { - my_message(ER_ILLEGAL_GRANT_FOR_TABLE, + MYSQL_YYABORT; + } + } + | ident '.' '*' + { + LEX *lex= Lex; + lex->current_select->db = $1.str; + if (lex->grant == GLOBAL_ACLS) + lex->grant = DB_ACLS & ~GRANT_ACL; + else if (lex->columns.elements) + { + my_message(ER_ILLEGAL_GRANT_FOR_TABLE, ER(ER_ILLEGAL_GRANT_FOR_TABLE), MYF(0)); - MYSQL_YYABORT; - } - } - | '*' '.' '*' - { - LEX *lex= Lex; - lex->current_select->db = NULL; - if (lex->grant == GLOBAL_ACLS) - lex->grant= GLOBAL_ACLS & ~GRANT_ACL; - else if (lex->columns.elements) - { - my_message(ER_ILLEGAL_GRANT_FOR_TABLE, + MYSQL_YYABORT; + } + } + | '*' '.' '*' + { + LEX *lex= Lex; + lex->current_select->db = NULL; + if (lex->grant == GLOBAL_ACLS) + lex->grant= GLOBAL_ACLS & ~GRANT_ACL; + else if (lex->columns.elements) + { + my_message(ER_ILLEGAL_GRANT_FOR_TABLE, ER(ER_ILLEGAL_GRANT_FOR_TABLE), MYF(0)); - MYSQL_YYABORT; - } - } - | table_ident - { - LEX *lex=Lex; - if (!lex->current_select->add_table_to_list(lex->thd, $1,NULL, + MYSQL_YYABORT; + } + } + | table_ident + { + LEX *lex=Lex; + if (!lex->current_select->add_table_to_list(lex->thd, $1,NULL, TL_OPTION_UPDATING)) - MYSQL_YYABORT; - if (lex->grant == GLOBAL_ACLS) - lex->grant = TABLE_ACLS & ~GRANT_ACL; - } - ; - + MYSQL_YYABORT; + if (lex->grant == GLOBAL_ACLS) + lex->grant = TABLE_ACLS & ~GRANT_ACL; + } + ; user_list: - user { if (Lex->users_list.push_back($1)) MYSQL_YYABORT;} - | user_list ',' user - { - if (Lex->users_list.push_back($3)) - MYSQL_YYABORT; - } - ; - + user + { + if (Lex->users_list.push_back($1)) + MYSQL_YYABORT; + } + | user_list ',' user + { + if (Lex->users_list.push_back($3)) + MYSQL_YYABORT; + } + ; grant_list: - grant_user { if (Lex->users_list.push_back($1)) MYSQL_YYABORT;} - | grant_list ',' grant_user - { - if (Lex->users_list.push_back($3)) - MYSQL_YYABORT; - } - ; - + grant_user + { + if (Lex->users_list.push_back($1)) + MYSQL_YYABORT; + } + | grant_list ',' grant_user + { + if (Lex->users_list.push_back($3)) + MYSQL_YYABORT; + } + ; grant_user: - user IDENTIFIED_SYM BY TEXT_STRING - { - $$=$1; $1->password=$4; - if ($4.length) - { - if (YYTHD->variables.old_passwords) - { - char *buff= - (char *) YYTHD->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH_323+1); - if (buff) - make_scrambled_password_323(buff, $4.str); - $1->password.str= buff; - $1->password.length= SCRAMBLED_PASSWORD_CHAR_LENGTH_323; - } - else - { - char *buff= - (char *) YYTHD->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH+1); - if (buff) - make_scrambled_password(buff, $4.str); - $1->password.str= buff; - $1->password.length= SCRAMBLED_PASSWORD_CHAR_LENGTH; - } - } - } - | user IDENTIFIED_SYM BY PASSWORD TEXT_STRING - { $$= $1; $1->password= $5; } - | user - { $$= $1; $1->password= null_lex_str; } + user IDENTIFIED_SYM BY TEXT_STRING + { + $$=$1; $1->password=$4; + if ($4.length) + { + if (YYTHD->variables.old_passwords) + { + char *buff= + (char *) YYTHD->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH_323+1); + if (buff) + make_scrambled_password_323(buff, $4.str); + $1->password.str= buff; + $1->password.length= SCRAMBLED_PASSWORD_CHAR_LENGTH_323; + } + else + { + char *buff= + (char *) YYTHD->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH+1); + if (buff) + make_scrambled_password(buff, $4.str); + $1->password.str= buff; + $1->password.length= SCRAMBLED_PASSWORD_CHAR_LENGTH; + } + } + } + | user IDENTIFIED_SYM BY PASSWORD TEXT_STRING + { $$= $1; $1->password= $5; } + | user + { $$= $1; $1->password= null_lex_str; } ; - opt_column_list: - /* empty */ - { - LEX *lex=Lex; - lex->grant |= lex->which_columns; - } - | '(' column_list ')'; - -column_list: - column_list ',' column_list_id - | column_list_id; - -column_list_id: - ident - { - String *new_str = new (YYTHD->mem_root) String((const char*) $1.str,$1.length,system_charset_info); - List_iterator iter(Lex->columns); - class LEX_COLUMN *point; - LEX *lex=Lex; - while ((point=iter++)) - { - if (!my_strcasecmp(system_charset_info, - point->column.ptr(), new_str->ptr())) - break; - } - lex->grant_tot_col|= lex->which_columns; - if (point) - point->rights |= lex->which_columns; - else - lex->columns.push_back(new LEX_COLUMN (*new_str,lex->which_columns)); - } + /* empty */ + { + LEX *lex=Lex; + lex->grant |= lex->which_columns; + } + | '(' column_list ')' ; +column_list: + column_list ',' column_list_id + | column_list_id + ; -require_clause: /* empty */ +column_list_id: + ident + { + String *new_str = new (YYTHD->mem_root) String((const char*) $1.str,$1.length,system_charset_info); + List_iterator iter(Lex->columns); + class LEX_COLUMN *point; + LEX *lex=Lex; + while ((point=iter++)) + { + if (!my_strcasecmp(system_charset_info, + point->column.ptr(), new_str->ptr())) + break; + } + lex->grant_tot_col|= lex->which_columns; + if (point) + point->rights |= lex->which_columns; + else + lex->columns.push_back(new LEX_COLUMN (*new_str,lex->which_columns)); + } + ; + +require_clause: + /* empty */ | REQUIRE_SYM require_list { Lex->ssl_type=SSL_TYPE_SPECIFIED; @@ -11070,220 +11510,223 @@ require_clause: /* empty */ { Lex->ssl_type=SSL_TYPE_X509; } - | REQUIRE_SYM NONE_SYM - { - Lex->ssl_type=SSL_TYPE_NONE; - } - ; + | REQUIRE_SYM NONE_SYM + { + Lex->ssl_type=SSL_TYPE_NONE; + } + ; grant_options: - /* empty */ {} - | WITH grant_option_list; + /* empty */ {} + | WITH grant_option_list + ; grant_option_list: - grant_option_list grant_option {} - | grant_option {} + grant_option_list grant_option {} + | grant_option {} ; grant_option: - GRANT OPTION { Lex->grant |= GRANT_ACL;} + GRANT OPTION { Lex->grant |= GRANT_ACL;} | MAX_QUERIES_PER_HOUR ulong_num - { - LEX *lex=Lex; - lex->mqh.questions=$2; - lex->mqh.specified_limits|= USER_RESOURCES::QUERIES_PER_HOUR; - } + { + LEX *lex=Lex; + lex->mqh.questions=$2; + lex->mqh.specified_limits|= USER_RESOURCES::QUERIES_PER_HOUR; + } | MAX_UPDATES_PER_HOUR ulong_num - { - LEX *lex=Lex; - lex->mqh.updates=$2; - lex->mqh.specified_limits|= USER_RESOURCES::UPDATES_PER_HOUR; - } + { + LEX *lex=Lex; + lex->mqh.updates=$2; + lex->mqh.specified_limits|= USER_RESOURCES::UPDATES_PER_HOUR; + } | MAX_CONNECTIONS_PER_HOUR ulong_num - { - LEX *lex=Lex; - lex->mqh.conn_per_hour= $2; - lex->mqh.specified_limits|= USER_RESOURCES::CONNECTIONS_PER_HOUR; - } + { + LEX *lex=Lex; + lex->mqh.conn_per_hour= $2; + lex->mqh.specified_limits|= USER_RESOURCES::CONNECTIONS_PER_HOUR; + } | MAX_USER_CONNECTIONS_SYM ulong_num - { - LEX *lex=Lex; - lex->mqh.user_conn= $2; - lex->mqh.specified_limits|= USER_RESOURCES::USER_CONNECTIONS; - } + { + LEX *lex=Lex; + lex->mqh.user_conn= $2; + lex->mqh.specified_limits|= USER_RESOURCES::USER_CONNECTIONS; + } ; begin: - BEGIN_SYM - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_BEGIN; - lex->start_transaction_opt= 0; - } - opt_work {} - ; + BEGIN_SYM + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_BEGIN; + lex->start_transaction_opt= 0; + } + opt_work {} + ; opt_work: - /* empty */ {} - | WORK_SYM {} + /* empty */ {} + | WORK_SYM {} ; opt_chain: - /* empty */ { $$= (YYTHD->variables.completion_type == 1); } - | AND_SYM NO_SYM CHAIN_SYM { $$=0; } - | AND_SYM CHAIN_SYM { $$=1; } - ; + /* empty */ + { $$= (YYTHD->variables.completion_type == 1); } + | AND_SYM NO_SYM CHAIN_SYM { $$=0; } + | AND_SYM CHAIN_SYM { $$=1; } + ; opt_release: - /* empty */ { $$= (YYTHD->variables.completion_type == 2); } - | RELEASE_SYM { $$=1; } - | NO_SYM RELEASE_SYM { $$=0; } - ; - + /* empty */ + { $$= (YYTHD->variables.completion_type == 2); } + | RELEASE_SYM { $$=1; } + | NO_SYM RELEASE_SYM { $$=0; } +; + opt_savepoint: - /* empty */ {} - | SAVEPOINT_SYM {} - ; + /* empty */ {} + | SAVEPOINT_SYM {} + ; commit: - COMMIT_SYM opt_work opt_chain opt_release - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_COMMIT; - lex->tx_chain= $3; - lex->tx_release= $4; - } - ; + COMMIT_SYM opt_work opt_chain opt_release + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_COMMIT; + lex->tx_chain= $3; + lex->tx_release= $4; + } + ; rollback: - ROLLBACK_SYM opt_work opt_chain opt_release - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_ROLLBACK; - lex->tx_chain= $3; - lex->tx_release= $4; - } - | ROLLBACK_SYM opt_work - TO_SYM opt_savepoint ident - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; - lex->ident= $5; - } - ; + ROLLBACK_SYM opt_work opt_chain opt_release + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK; + lex->tx_chain= $3; + lex->tx_release= $4; + } + | ROLLBACK_SYM opt_work + TO_SYM opt_savepoint ident + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; + lex->ident= $5; + } + ; savepoint: - SAVEPOINT_SYM ident - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SAVEPOINT; - lex->ident= $2; - } - ; + SAVEPOINT_SYM ident + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SAVEPOINT; + lex->ident= $2; + } + ; release: - RELEASE_SYM SAVEPOINT_SYM ident - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_RELEASE_SAVEPOINT; - lex->ident= $3; - } - ; - + RELEASE_SYM SAVEPOINT_SYM ident + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_RELEASE_SAVEPOINT; + lex->ident= $3; + } + ; + /* UNIONS : glue selects together */ union_clause: - /* empty */ {} - | union_list - ; + /* empty */ {} + | union_list + ; union_list: - UNION_SYM union_option - { - LEX *lex=Lex; - if (lex->result) - { - /* Only the last SELECT can have INTO...... */ - my_error(ER_WRONG_USAGE, MYF(0), "UNION", "INTO"); - MYSQL_YYABORT; - } - if (lex->current_select->linkage == GLOBAL_OPTIONS_TYPE) - { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } - /* This counter shouldn't be incremented for UNION parts */ - Lex->nest_level--; - if (mysql_new_select(lex, 0)) - MYSQL_YYABORT; - mysql_init_select(lex); - lex->current_select->linkage=UNION_TYPE; - if ($2) /* UNION DISTINCT - remember position */ - lex->current_select->master_unit()->union_distinct= - lex->current_select; - } - select_init - { - /* - Remove from the name resolution context stack the context of the - last select in the union. - */ - Lex->pop_context(); - } - ; + UNION_SYM union_option + { + LEX *lex=Lex; + if (lex->result) + { + /* Only the last SELECT can have INTO...... */ + my_error(ER_WRONG_USAGE, MYF(0), "UNION", "INTO"); + MYSQL_YYABORT; + } + if (lex->current_select->linkage == GLOBAL_OPTIONS_TYPE) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + /* This counter shouldn't be incremented for UNION parts */ + Lex->nest_level--; + if (mysql_new_select(lex, 0)) + MYSQL_YYABORT; + mysql_init_select(lex); + lex->current_select->linkage=UNION_TYPE; + if ($2) /* UNION DISTINCT - remember position */ + lex->current_select->master_unit()->union_distinct= + lex->current_select; + } + select_init + { + /* + Remove from the name resolution context stack the context of the + last select in the union. + */ + Lex->pop_context(); + } + ; union_opt: - /* Empty */ { $$= 0; } - | union_list { $$= 1; } - | union_order_or_limit { $$= 1; } - ; + /* Empty */ { $$= 0; } + | union_list { $$= 1; } + | union_order_or_limit { $$= 1; } + ; union_order_or_limit: - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - DBUG_ASSERT(lex->current_select->linkage != GLOBAL_OPTIONS_TYPE); - SELECT_LEX *sel= lex->current_select; - SELECT_LEX_UNIT *unit= sel->master_unit(); - SELECT_LEX *fake= unit->fake_select_lex; - if (fake) - { - unit->global_parameters= fake; - fake->no_table_names_allowed= 1; - lex->current_select= fake; - } - thd->where= "global ORDER clause"; - } - order_or_limit { - THD *thd= YYTHD; - thd->lex->current_select->no_table_names_allowed= 0; - thd->where= ""; + THD *thd= YYTHD; + LEX *lex= thd->lex; + DBUG_ASSERT(lex->current_select->linkage != GLOBAL_OPTIONS_TYPE); + SELECT_LEX *sel= lex->current_select; + SELECT_LEX_UNIT *unit= sel->master_unit(); + SELECT_LEX *fake= unit->fake_select_lex; + if (fake) + { + unit->global_parameters= fake; + fake->no_table_names_allowed= 1; + lex->current_select= fake; + } + thd->where= "global ORDER clause"; } - ; + order_or_limit + { + THD *thd= YYTHD; + thd->lex->current_select->no_table_names_allowed= 0; + thd->where= ""; + } + ; order_or_limit: - order_clause opt_limit_clause_init - | limit_clause - ; + order_clause opt_limit_clause_init + | limit_clause + ; union_option: - /* empty */ { $$=1; } - | DISTINCT { $$=1; } - | ALL { $$=0; } + /* empty */ { $$=1; } + | DISTINCT { $$=1; } + | ALL { $$=0; } ; subselect: - SELECT_SYM subselect_start subselect_init subselect_end - { - $$= $3; - } + SELECT_SYM subselect_start subselect_init subselect_end + { + $$= $3; + } | '(' subselect_start subselect ')' { - THD *thd= YYTHD; + THD *thd= YYTHD; /* note that a local variable can't be used for $3 as it's used in local variable construction @@ -11298,49 +11741,53 @@ subselect: while ((item= it++)) add_item_to_list(thd, item); } - union_clause subselect_end { $$= $3; }; + union_clause subselect_end { $$= $3; } + ; subselect_init: - select_init2 - { - $$= Lex->current_select->master_unit()->first_select(); - }; + select_init2 + { + $$= Lex->current_select->master_unit()->first_select(); + } + ; subselect_start: - { - LEX *lex=Lex; - if (!lex->expr_allows_subselect || - lex->sql_command == (int)SQLCOM_PURGE) - { - my_parse_error(ER(ER_SYNTAX_ERROR)); - MYSQL_YYABORT; - } - /* - we are making a "derived table" for the parenthesis - as we need to have a lex level to fit the union - after the parenthesis, e.g. - (SELECT .. ) UNION ... becomes - SELECT * FROM ((SELECT ...) UNION ...) - */ - if (mysql_new_select(Lex, 1)) - MYSQL_YYABORT; - }; + { + LEX *lex=Lex; + if (!lex->expr_allows_subselect || + lex->sql_command == (int)SQLCOM_PURGE) + { + my_parse_error(ER(ER_SYNTAX_ERROR)); + MYSQL_YYABORT; + } + /* + we are making a "derived table" for the parenthesis + as we need to have a lex level to fit the union + after the parenthesis, e.g. + (SELECT .. ) UNION ... becomes + SELECT * FROM ((SELECT ...) UNION ...) + */ + if (mysql_new_select(Lex, 1)) + MYSQL_YYABORT; + } + ; subselect_end: - { - LEX *lex=Lex; - lex->pop_context(); - SELECT_LEX *child= lex->current_select; - lex->current_select = lex->current_select->return_after_parsing(); - lex->nest_level--; - lex->current_select->n_child_sum_items += child->n_sum_items; - /* - A subselect can add fields to an outer select. Reserve space for - them. - */ - lex->current_select->select_n_where_fields+= + { + LEX *lex=Lex; + lex->pop_context(); + SELECT_LEX *child= lex->current_select; + lex->current_select = lex->current_select->return_after_parsing(); + lex->nest_level--; + lex->current_select->n_child_sum_items += child->n_sum_items; + /* + A subselect can add fields to an outer select. Reserve space for + them. + */ + lex->current_select->select_n_where_fields+= child->select_n_where_fields; - }; + } + ; /************************************************************************** @@ -11349,22 +11796,22 @@ subselect_end: **************************************************************************/ view_or_trigger_or_sp_or_event: - definer view_or_trigger_or_sp_or_event_tail - {} - | view_replace_or_algorithm definer view_tail - {} - ; + definer view_or_trigger_or_sp_or_event_tail + {} + | view_replace_or_algorithm definer view_tail + {} + ; view_or_trigger_or_sp_or_event_tail: - view_tail - {} - | trigger_tail - {} - | sp_tail - {} - | event_tail - {} - ; + view_tail + {} + | trigger_tail + {} + | sp_tail + {} + | event_tail + {} + ; /************************************************************************** @@ -11373,22 +11820,22 @@ view_or_trigger_or_sp_or_event_tail: **************************************************************************/ definer: - /* empty */ - { - /* - We have to distinguish missing DEFINER-clause from case when - CURRENT_USER specified as definer explicitly in order to properly - handle CREATE TRIGGER statements which come to replication thread - from older master servers (i.e. to create non-suid trigger in this - case). - */ - YYTHD->lex->definer= 0; - } - | DEFINER_SYM EQ user - { - YYTHD->lex->definer= get_current_user(YYTHD, $3); - } - ; + /* empty */ + { + /* + We have to distinguish missing DEFINER-clause from case when + CURRENT_USER specified as definer explicitly in order to properly + handle CREATE TRIGGER statements which come to replication thread + from older master servers (i.e. to create non-suid trigger in this + case). + */ + YYTHD->lex->definer= 0; + } + | DEFINER_SYM EQ user + { + YYTHD->lex->definer= get_current_user(YYTHD, $3); + } + ; /************************************************************************** @@ -11397,128 +11844,128 @@ definer: **************************************************************************/ view_replace_or_algorithm: - view_replace - {} - | view_replace view_algorithm - {} - | view_algorithm - {} - ; + view_replace + {} + | view_replace view_algorithm + {} + | view_algorithm + {} + ; view_replace: - OR_SYM REPLACE - { Lex->create_view_mode= VIEW_CREATE_OR_REPLACE; } - ; + OR_SYM REPLACE + { Lex->create_view_mode= VIEW_CREATE_OR_REPLACE; } + ; view_algorithm: - ALGORITHM_SYM EQ UNDEFINED_SYM - { Lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED; } - | ALGORITHM_SYM EQ MERGE_SYM - { Lex->create_view_algorithm= VIEW_ALGORITHM_MERGE; } - | ALGORITHM_SYM EQ TEMPTABLE_SYM - { Lex->create_view_algorithm= VIEW_ALGORITHM_TMPTABLE; } - ; + ALGORITHM_SYM EQ UNDEFINED_SYM + { Lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED; } + | ALGORITHM_SYM EQ MERGE_SYM + { Lex->create_view_algorithm= VIEW_ALGORITHM_MERGE; } + | ALGORITHM_SYM EQ TEMPTABLE_SYM + { Lex->create_view_algorithm= VIEW_ALGORITHM_TMPTABLE; } + ; view_suid: - /* empty */ - { Lex->create_view_suid= VIEW_SUID_DEFAULT; } - | SQL_SYM SECURITY_SYM DEFINER_SYM - { Lex->create_view_suid= VIEW_SUID_DEFINER; } - | SQL_SYM SECURITY_SYM INVOKER_SYM - { Lex->create_view_suid= VIEW_SUID_INVOKER; } - ; + /* empty */ + { Lex->create_view_suid= VIEW_SUID_DEFAULT; } + | SQL_SYM SECURITY_SYM DEFINER_SYM + { Lex->create_view_suid= VIEW_SUID_DEFINER; } + | SQL_SYM SECURITY_SYM INVOKER_SYM + { Lex->create_view_suid= VIEW_SUID_INVOKER; } + ; view_tail: - view_suid VIEW_SYM table_ident - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - lex->sql_command= SQLCOM_CREATE_VIEW; - /* first table in list is target VIEW name */ - if (!lex->select_lex.add_table_to_list(thd, $3, NULL, TL_OPTION_UPDATING)) - MYSQL_YYABORT; - } - view_list_opt AS - { - THD *thd= YYTHD; - Lex_input_stream *lip= thd->m_lip; + view_suid VIEW_SYM table_ident + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + lex->sql_command= SQLCOM_CREATE_VIEW; + /* first table in list is target VIEW name */ + if (!lex->select_lex.add_table_to_list(thd, $3, NULL, TL_OPTION_UPDATING)) + MYSQL_YYABORT; + } + view_list_opt AS + { + THD *thd= YYTHD; + Lex_input_stream *lip= thd->m_lip; - lip->body_utf8_start(thd, lip->get_cpp_ptr()); - } - view_select - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; + lip->body_utf8_start(thd, lip->get_cpp_ptr()); + } + view_select + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; - lip->body_utf8_append(lip->get_cpp_ptr()); + lip->body_utf8_append(lip->get_cpp_ptr()); - lex->view_body_utf8.str= thd->strmake(lip->get_body_utf8_str(), - lip->get_body_utf8_length()); - lex->view_body_utf8.length= lip->get_body_utf8_length(); + lex->view_body_utf8.str= thd->strmake(lip->get_body_utf8_str(), + lip->get_body_utf8_length()); + lex->view_body_utf8.length= lip->get_body_utf8_length(); - trim_whitespace(&my_charset_utf8_general_ci, &lex->view_body_utf8); - } - ; + trim_whitespace(&my_charset_utf8_general_ci, &lex->view_body_utf8); + } + ; view_list_opt: - /* empty */ - {} - | '(' view_list ')' - ; + /* empty */ + {} + | '(' view_list ')' + ; view_list: - ident - { - Lex->view_list.push_back((LEX_STRING*) - sql_memdup(&$1, sizeof(LEX_STRING))); - } - | view_list ',' ident - { - Lex->view_list.push_back((LEX_STRING*) - sql_memdup(&$3, sizeof(LEX_STRING))); - } - ; + ident + { + Lex->view_list.push_back((LEX_STRING*) + sql_memdup(&$1, sizeof(LEX_STRING))); + } + | view_list ',' ident + { + Lex->view_list.push_back((LEX_STRING*) + sql_memdup(&$3, sizeof(LEX_STRING))); + } + ; view_select: - { - THD *thd= YYTHD; - LEX *lex= Lex; - Lex_input_stream *lip= thd->m_lip; - lex->parsing_options.allows_variable= FALSE; - lex->parsing_options.allows_select_into= FALSE; - lex->parsing_options.allows_select_procedure= FALSE; - lex->parsing_options.allows_derived= FALSE; - lex->create_view_select_start= lip->get_cpp_ptr(); - } - view_select_aux view_check_option - { - THD *thd= YYTHD; - LEX *lex= Lex; - Lex_input_stream *lip= thd->m_lip; - lex->parsing_options.allows_variable= TRUE; - lex->parsing_options.allows_select_into= TRUE; - lex->parsing_options.allows_select_procedure= TRUE; - lex->parsing_options.allows_derived= TRUE; - lex->create_view_select_end= lip->get_cpp_ptr(); - } + { + THD *thd= YYTHD; + LEX *lex= Lex; + Lex_input_stream *lip= thd->m_lip; + lex->parsing_options.allows_variable= FALSE; + lex->parsing_options.allows_select_into= FALSE; + lex->parsing_options.allows_select_procedure= FALSE; + lex->parsing_options.allows_derived= FALSE; + lex->create_view_select_start= lip->get_cpp_ptr(); + } + view_select_aux view_check_option + { + THD *thd= YYTHD; + LEX *lex= Lex; + Lex_input_stream *lip= thd->m_lip; + lex->parsing_options.allows_variable= TRUE; + lex->parsing_options.allows_select_into= TRUE; + lex->parsing_options.allows_select_procedure= TRUE; + lex->parsing_options.allows_derived= TRUE; + lex->create_view_select_end= lip->get_cpp_ptr(); + } ; view_select_aux: - SELECT_SYM select_init2 + SELECT_SYM select_init2 | '(' select_paren ')' union_opt ; view_check_option: - /* empty */ - { Lex->create_view_check= VIEW_CHECK_NONE; } - | WITH CHECK_SYM OPTION - { Lex->create_view_check= VIEW_CHECK_CASCADED; } - | WITH CASCADED CHECK_SYM OPTION - { Lex->create_view_check= VIEW_CHECK_CASCADED; } - | WITH LOCAL_SYM CHECK_SYM OPTION - { Lex->create_view_check= VIEW_CHECK_LOCAL; } - ; + /* empty */ + { Lex->create_view_check= VIEW_CHECK_NONE; } + | WITH CHECK_SYM OPTION + { Lex->create_view_check= VIEW_CHECK_CASCADED; } + | WITH CASCADED CHECK_SYM OPTION + { Lex->create_view_check= VIEW_CHECK_CASCADED; } + | WITH LOCAL_SYM CHECK_SYM OPTION + { Lex->create_view_check= VIEW_CHECK_LOCAL; } + ; /************************************************************************** @@ -11527,93 +11974,93 @@ view_check_option: **************************************************************************/ trigger_tail: - TRIGGER_SYM - remember_name - sp_name - trg_action_time - trg_event - ON - remember_name /* $7 */ - { /* $8 */ - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; - lex->raw_trg_on_table_name_begin= lip->get_tok_start(); - } - table_ident /* $9 */ - FOR_SYM - remember_name /* $11 */ - { /* $12 */ - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; - lex->raw_trg_on_table_name_end= lip->get_tok_start(); - } - EACH_SYM - ROW_SYM - { /* $15 */ - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; - sp_head *sp; + TRIGGER_SYM + remember_name + sp_name + trg_action_time + trg_event + ON + remember_name /* $7 */ + { /* $8 */ + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; + lex->raw_trg_on_table_name_begin= lip->get_tok_start(); + } + table_ident /* $9 */ + FOR_SYM + remember_name /* $11 */ + { /* $12 */ + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; + lex->raw_trg_on_table_name_end= lip->get_tok_start(); + } + EACH_SYM + ROW_SYM + { /* $15 */ + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; + sp_head *sp; - if (lex->sphead) - { - my_error(ER_SP_NO_RECURSIVE_CREATE, MYF(0), "TRIGGER"); - MYSQL_YYABORT; - } + if (lex->sphead) + { + my_error(ER_SP_NO_RECURSIVE_CREATE, MYF(0), "TRIGGER"); + MYSQL_YYABORT; + } - if (!(sp= new sp_head())) - MYSQL_YYABORT; - sp->reset_thd_mem_root(thd); - sp->init(lex); - sp->m_type= TYPE_ENUM_TRIGGER; - sp->init_sp_name(thd, $3); - lex->stmt_definition_begin= $2; - lex->ident.str= $7; - lex->ident.length= $11 - $7; + if (!(sp= new sp_head())) + MYSQL_YYABORT; + sp->reset_thd_mem_root(thd); + sp->init(lex); + sp->m_type= TYPE_ENUM_TRIGGER; + sp->init_sp_name(thd, $3); + lex->stmt_definition_begin= $2; + lex->ident.str= $7; + lex->ident.length= $11 - $7; - lex->sphead= sp; - lex->spname= $3; - /* - We have to turn of CLIENT_MULTI_QUERIES while parsing a - stored procedure, otherwise yylex will chop it into pieces - at each ';'. - */ - $$= thd->client_capabilities & CLIENT_MULTI_QUERIES; - thd->client_capabilities &= ~CLIENT_MULTI_QUERIES; + lex->sphead= sp; + lex->spname= $3; + /* + We have to turn of CLIENT_MULTI_QUERIES while parsing a + stored procedure, otherwise yylex will chop it into pieces + at each ';'. + */ + $$= thd->client_capabilities & CLIENT_MULTI_QUERIES; + thd->client_capabilities &= ~CLIENT_MULTI_QUERIES; - bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics)); - lex->sphead->m_chistics= &lex->sp_chistics; - lex->sphead->set_body_start(thd, lip->get_cpp_ptr()); - } - sp_proc_stmt /* $16 */ - { /* $17 */ - LEX *lex= Lex; - sp_head *sp= lex->sphead; + bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics)); + lex->sphead->m_chistics= &lex->sp_chistics; + lex->sphead->set_body_start(thd, lip->get_cpp_ptr()); + } + sp_proc_stmt /* $16 */ + { /* $17 */ + LEX *lex= Lex; + sp_head *sp= lex->sphead; - lex->sql_command= SQLCOM_CREATE_TRIGGER; - sp->set_stmt_end(YYTHD); - /* Restore flag if it was cleared above */ + lex->sql_command= SQLCOM_CREATE_TRIGGER; + sp->set_stmt_end(YYTHD); + /* Restore flag if it was cleared above */ - YYTHD->client_capabilities |= $15; - sp->restore_thd_mem_root(YYTHD); + YYTHD->client_capabilities |= $15; + sp->restore_thd_mem_root(YYTHD); - if (sp->is_not_allowed_in_function("trigger")) - MYSQL_YYABORT; + if (sp->is_not_allowed_in_function("trigger")) + MYSQL_YYABORT; - /* - We have to do it after parsing trigger body, because some of - sp_proc_stmt alternatives are not saving/restoring LEX, so - lex->query_tables can be wiped out. - */ - if (!lex->select_lex.add_table_to_list(YYTHD, $9, - (LEX_STRING*) 0, - TL_OPTION_UPDATING, - TL_IGNORE)) - MYSQL_YYABORT; - } - ; + /* + We have to do it after parsing trigger body, because some of + sp_proc_stmt alternatives are not saving/restoring LEX, so + lex->query_tables can be wiped out. + */ + if (!lex->select_lex.add_table_to_list(YYTHD, $9, + (LEX_STRING*) 0, + TL_OPTION_UPDATING, + TL_IGNORE)) + MYSQL_YYABORT; + } + ; /************************************************************************** @@ -11622,181 +12069,189 @@ trigger_tail: **************************************************************************/ sp_tail: - udf_func_type remember_name FUNCTION_SYM sp_name - { - LEX *lex=Lex; - lex->udf.type= $1; - lex->stmt_definition_begin= $2; - lex->spname= $4; - } - create_function_tail - {} - | PROCEDURE remember_name sp_name - { - LEX *lex= Lex; - sp_head *sp; + udf_func_type remember_name FUNCTION_SYM sp_name + { + LEX *lex=Lex; + lex->udf.type= $1; + lex->stmt_definition_begin= $2; + lex->spname= $4; + } + create_function_tail + {} + | PROCEDURE remember_name sp_name + { + LEX *lex= Lex; + sp_head *sp; - if (lex->sphead) - { - my_error(ER_SP_NO_RECURSIVE_CREATE, MYF(0), "PROCEDURE"); - MYSQL_YYABORT; - } + if (lex->sphead) + { + my_error(ER_SP_NO_RECURSIVE_CREATE, MYF(0), "PROCEDURE"); + MYSQL_YYABORT; + } - lex->stmt_definition_begin= $2; + lex->stmt_definition_begin= $2; - /* Order is important here: new - reset - init */ - sp= new sp_head(); - sp->reset_thd_mem_root(YYTHD); - sp->init(lex); - sp->m_type= TYPE_ENUM_PROCEDURE; - sp->init_sp_name(YYTHD, $3); + /* Order is important here: new - reset - init */ + sp= new sp_head(); + sp->reset_thd_mem_root(YYTHD); + sp->init(lex); + sp->m_type= TYPE_ENUM_PROCEDURE; + sp->init_sp_name(YYTHD, $3); - lex->sphead= sp; - /* - * We have to turn of CLIENT_MULTI_QUERIES while parsing a - * stored procedure, otherwise yylex will chop it into pieces - * at each ';'. - */ - $$= YYTHD->client_capabilities & CLIENT_MULTI_QUERIES; - YYTHD->client_capabilities &= (~CLIENT_MULTI_QUERIES); - } - '(' - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; - const char* tmp_param_begin; + lex->sphead= sp; + /* + * We have to turn of CLIENT_MULTI_QUERIES while parsing a + * stored procedure, otherwise yylex will chop it into pieces + * at each ';'. + */ + $$= YYTHD->client_capabilities & CLIENT_MULTI_QUERIES; + YYTHD->client_capabilities &= (~CLIENT_MULTI_QUERIES); + } + '(' + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; + const char* tmp_param_begin; - tmp_param_begin= lip->get_cpp_tok_start(); - tmp_param_begin++; - lex->sphead->m_param_begin= tmp_param_begin; - } - sp_pdparam_list - ')' - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; + tmp_param_begin= lip->get_cpp_tok_start(); + tmp_param_begin++; + lex->sphead->m_param_begin= tmp_param_begin; + } + sp_pdparam_list + ')' + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; - lex->sphead->m_param_end= lip->get_cpp_tok_start(); - bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics)); - } - sp_c_chistics - { - THD *thd= YYTHD; - LEX *lex= thd->lex; - Lex_input_stream *lip= thd->m_lip; + lex->sphead->m_param_end= lip->get_cpp_tok_start(); + bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics)); + } + sp_c_chistics + { + THD *thd= YYTHD; + LEX *lex= thd->lex; + Lex_input_stream *lip= thd->m_lip; - lex->sphead->m_chistics= &lex->sp_chistics; - lex->sphead->set_body_start(thd, lip->get_cpp_tok_start()); - } - sp_proc_stmt - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; + lex->sphead->m_chistics= &lex->sp_chistics; + lex->sphead->set_body_start(thd, lip->get_cpp_tok_start()); + } + sp_proc_stmt + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; - sp->set_stmt_end(YYTHD); - lex->sql_command= SQLCOM_CREATE_PROCEDURE; - /* - Restore flag if it was cleared above - Be careful with counting. the block where we save the value - is $4. - */ - YYTHD->client_capabilities |= $4; - sp->restore_thd_mem_root(YYTHD); - } - ; + sp->set_stmt_end(YYTHD); + lex->sql_command= SQLCOM_CREATE_PROCEDURE; + /* + Restore flag if it was cleared above + Be careful with counting. the block where we save the value + is $4. + */ + YYTHD->client_capabilities |= $4; + sp->restore_thd_mem_root(YYTHD); + } + ; /*************************************************************************/ -xa: XA_SYM begin_or_start xid opt_join_or_resume - { - Lex->sql_command = SQLCOM_XA_START; - } - | XA_SYM END xid opt_suspend - { - Lex->sql_command = SQLCOM_XA_END; - } - | XA_SYM PREPARE_SYM xid - { - Lex->sql_command = SQLCOM_XA_PREPARE; - } - | XA_SYM COMMIT_SYM xid opt_one_phase - { - Lex->sql_command = SQLCOM_XA_COMMIT; - } - | XA_SYM ROLLBACK_SYM xid - { - Lex->sql_command = SQLCOM_XA_ROLLBACK; - } - | XA_SYM RECOVER_SYM - { - Lex->sql_command = SQLCOM_XA_RECOVER; - } - ; +xa: + XA_SYM begin_or_start xid opt_join_or_resume + { + Lex->sql_command = SQLCOM_XA_START; + } + | XA_SYM END xid opt_suspend + { + Lex->sql_command = SQLCOM_XA_END; + } + | XA_SYM PREPARE_SYM xid + { + Lex->sql_command = SQLCOM_XA_PREPARE; + } + | XA_SYM COMMIT_SYM xid opt_one_phase + { + Lex->sql_command = SQLCOM_XA_COMMIT; + } + | XA_SYM ROLLBACK_SYM xid + { + Lex->sql_command = SQLCOM_XA_ROLLBACK; + } + | XA_SYM RECOVER_SYM + { + Lex->sql_command = SQLCOM_XA_RECOVER; + } + ; -xid: text_string - { - MYSQL_YYABORT_UNLESS($1->length() <= MAXGTRIDSIZE); - if (!(Lex->xid=(XID *)YYTHD->alloc(sizeof(XID)))) - MYSQL_YYABORT; - Lex->xid->set(1L, $1->ptr(), $1->length(), 0, 0); - } - | text_string ',' text_string - { - MYSQL_YYABORT_UNLESS($1->length() <= MAXGTRIDSIZE && $3->length() <= MAXBQUALSIZE); - if (!(Lex->xid=(XID *)YYTHD->alloc(sizeof(XID)))) - MYSQL_YYABORT; - Lex->xid->set(1L, $1->ptr(), $1->length(), $3->ptr(), $3->length()); - } - | text_string ',' text_string ',' ulong_num - { - MYSQL_YYABORT_UNLESS($1->length() <= MAXGTRIDSIZE && $3->length() <= MAXBQUALSIZE); - if (!(Lex->xid=(XID *)YYTHD->alloc(sizeof(XID)))) - MYSQL_YYABORT; - Lex->xid->set($5, $1->ptr(), $1->length(), $3->ptr(), $3->length()); - } - ; +xid: + text_string + { + MYSQL_YYABORT_UNLESS($1->length() <= MAXGTRIDSIZE); + if (!(Lex->xid=(XID *)YYTHD->alloc(sizeof(XID)))) + MYSQL_YYABORT; + Lex->xid->set(1L, $1->ptr(), $1->length(), 0, 0); + } + | text_string ',' text_string + { + MYSQL_YYABORT_UNLESS($1->length() <= MAXGTRIDSIZE && $3->length() <= MAXBQUALSIZE); + if (!(Lex->xid=(XID *)YYTHD->alloc(sizeof(XID)))) + MYSQL_YYABORT; + Lex->xid->set(1L, $1->ptr(), $1->length(), $3->ptr(), $3->length()); + } + | text_string ',' text_string ',' ulong_num + { + MYSQL_YYABORT_UNLESS($1->length() <= MAXGTRIDSIZE && $3->length() <= MAXBQUALSIZE); + if (!(Lex->xid=(XID *)YYTHD->alloc(sizeof(XID)))) + MYSQL_YYABORT; + Lex->xid->set($5, $1->ptr(), $1->length(), $3->ptr(), $3->length()); + } + ; -begin_or_start: BEGIN_SYM {} - | START_SYM {} - ; +begin_or_start: + BEGIN_SYM {} + | START_SYM {} + ; opt_join_or_resume: - /* nothing */ { Lex->xa_opt=XA_NONE; } - | JOIN_SYM { Lex->xa_opt=XA_JOIN; } - | RESUME_SYM { Lex->xa_opt=XA_RESUME; } - ; + /* nothing */ { Lex->xa_opt=XA_NONE; } + | JOIN_SYM { Lex->xa_opt=XA_JOIN; } + | RESUME_SYM { Lex->xa_opt=XA_RESUME; } + ; opt_one_phase: - /* nothing */ { Lex->xa_opt=XA_NONE; } - | ONE_SYM PHASE_SYM { Lex->xa_opt=XA_ONE_PHASE; } - ; + /* nothing */ { Lex->xa_opt=XA_NONE; } + | ONE_SYM PHASE_SYM { Lex->xa_opt=XA_ONE_PHASE; } + ; opt_suspend: - /* nothing */ { Lex->xa_opt=XA_NONE; } - | SUSPEND_SYM { Lex->xa_opt=XA_SUSPEND; } - opt_migrate - ; + /* nothing */ + { Lex->xa_opt=XA_NONE; } + | SUSPEND_SYM + { Lex->xa_opt=XA_SUSPEND; } + opt_migrate + ; opt_migrate: - /* nothing */ { } - | FOR_SYM MIGRATE_SYM { Lex->xa_opt=XA_FOR_MIGRATE; } - ; + /* nothing */ {} + | FOR_SYM MIGRATE_SYM { Lex->xa_opt=XA_FOR_MIGRATE; } + ; install: - INSTALL_SYM PLUGIN_SYM ident SONAME_SYM TEXT_STRING_sys - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_INSTALL_PLUGIN; - lex->comment= $3; - lex->ident= $5; - }; + INSTALL_SYM PLUGIN_SYM ident SONAME_SYM TEXT_STRING_sys + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_INSTALL_PLUGIN; + lex->comment= $3; + lex->ident= $5; + } + ; uninstall: - UNINSTALL_SYM PLUGIN_SYM ident - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_UNINSTALL_PLUGIN; - lex->comment= $3; - }; + UNINSTALL_SYM PLUGIN_SYM ident + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_UNINSTALL_PLUGIN; + lex->comment= $3; + } + ; + From 91fe15bb9d9fd8e6788dc8b2180c57c6a432faad Mon Sep 17 00:00:00 2001 From: "kostja@bodhi.(none)" <> Date: Wed, 15 Aug 2007 17:43:08 +0400 Subject: [PATCH 05/15] Fix doxygen warnings. --- client/mysqldump.c | 4 +- mysys/test_charset.c | 2 +- sql/event_db_repository.cc | 6 +- sql/events.cc | 3 +- sql/events.h | 9 +- sql/item_create.cc | 330 ++++++++++++++++++------------------- sql/item_create.h | 8 +- sql/item_subselect.cc | 2 +- sql/lock.cc | 13 +- sql/sp.cc | 2 +- sql/sp_head.h | 2 +- sql/sql_analyse.cc | 2 +- sql/sql_analyse.h | 2 +- sql/sql_base.cc | 6 +- sql/sql_db.cc | 2 +- sql/sql_lex.cc | 15 +- sql/sql_lex.h | 19 +-- sql/sql_parse.cc | 11 +- sql/sql_plugin.cc | 2 +- sql/sql_prepare.cc | 1 - sql/sql_show.cc | 4 +- sql/sql_trigger.cc | 16 +- sql/sql_update.cc | 8 +- sql/table.h | 10 +- 24 files changed, 247 insertions(+), 232 deletions(-) diff --git a/client/mysqldump.c b/client/mysqldump.c index 566760d2db3..3d2aec92dea 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -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. - @param[in] def_str CREATE FUNCTION|PROCEDURE statement string. - @param[in] def_length length of the def_str. + @param[in] def_str CREATE FUNCTION|PROCEDURE statement string. + @param[in] def_str_length length of the def_str. @return pointer to the new allocated query string. */ diff --git a/mysys/test_charset.c b/mysys/test_charset.c index 08154e67863..d867b49304e 100644 --- a/mysys/test_charset.c +++ b/mysys/test_charset.c @@ -77,7 +77,7 @@ int main(int argc, char **argv) { _print_csinfo(cs); fflush(stdout); -#define NOT_USED_ANYMORE +#ifdef NOT_USED_ANYMORE cs_list = list_charsets(MYF(MY_CS_COMPILED | MY_CS_CONFIG)); printf("LIST OF CHARSETS (compiled + *.conf):\n%s\n", cs_list); my_free(cs_list,MYF(0)); diff --git a/sql/event_db_repository.cc b/sql/event_db_repository.cc index b7bcb6344fd..96c01ad9a0e 100644 --- a/sql/event_db_repository.cc +++ b/sql/event_db_repository.cc @@ -556,7 +556,7 @@ Event_db_repository::open_event_table(THD *thd, enum thr_lock_type lock_type, only creates a record on disk. @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] create_if_not TRUE if IF NOT EXISTS clause was provided to CREATE EVENT statement @@ -657,7 +657,7 @@ end: @param[in,out] thd thread handle @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 @param[in] new_name not NULL if ALTER EVENT RENAME points at a new event name @@ -812,7 +812,7 @@ end: @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 diff --git a/sql/events.cc b/sql/events.cc index 8d32580816f..bdb9512647f 100644 --- a/sql/events.cc +++ b/sql/events.cc @@ -790,8 +790,7 @@ Events::show_create_event(THD *thd, LEX_STRING dbname, LEX_STRING name) Check access rights and fill INFORMATION_SCHEMA.events table. @param[in,out] thd Thread context - @param[in] table The temporary table to fill. - cond Unused + @param[in] tables The temporary table to fill. In MySQL INFORMATION_SCHEMA tables are temporary tables that are created and filled on demand. In this function, we fill diff --git a/sql/events.h b/sql/events.h index 1b99b072fd7..078ab63041b 100644 --- a/sql/events.h +++ b/sql/events.h @@ -15,9 +15,11 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* +/** @file A public interface of Events Scheduler module. + @defgroup Event Scheduler + @{ */ class Event_parse_data; @@ -42,7 +44,7 @@ int 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 interface provided by a static method of this class. No instance of this @@ -152,5 +154,8 @@ private: void operator=(Events &); }; +/** + @} (end of group Event Scheduler) +*/ #endif /* _EVENT_H_ */ diff --git a/sql/item_create.cc b/sql/item_create.cc index fa15b992e5c..03424da80a8 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -37,7 +37,7 @@ class Create_native_func : public Create_func { public: - virtual Item* create(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create(THD *thd, LEX_STRING name, List *item_list); /** Builder method, with no arguments. @@ -46,7 +46,7 @@ public: @param item_list The function parameters, none of which are named @return An item representing the function call */ - virtual Item* create_native(THD *thd, LEX_STRING name, + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list) = 0; protected: @@ -64,14 +64,14 @@ protected: class Create_func_arg0 : public Create_func { public: - virtual Item* create(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create(THD *thd, LEX_STRING name, List *item_list); /** Builder method, with no arguments. @param thd The current thread @return An item representing the function call */ - virtual Item* create(THD *thd) = 0; + virtual Item *create(THD *thd) = 0; protected: /** Constructor. */ @@ -88,7 +88,7 @@ protected: class Create_func_arg1 : public Create_func { public: - virtual Item* create(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create(THD *thd, LEX_STRING name, List *item_list); /** Builder method, with one argument. @@ -96,7 +96,7 @@ public: @param arg1 The first argument of the function @return An item representing the function call */ - virtual Item* create(THD *thd, Item *arg1) = 0; + virtual Item *create(THD *thd, Item *arg1) = 0; protected: /** Constructor. */ @@ -113,7 +113,7 @@ protected: class Create_func_arg2 : public Create_func { public: - virtual Item* create(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create(THD *thd, LEX_STRING name, List *item_list); /** Builder method, with two arguments. @@ -122,7 +122,7 @@ public: @param arg2 The second argument of the function @return An item representing the function call */ - virtual Item* create(THD *thd, Item *arg1, Item *arg2) = 0; + virtual Item *create(THD *thd, Item *arg1, Item *arg2) = 0; protected: /** Constructor. */ @@ -139,7 +139,7 @@ protected: class Create_func_arg3 : public Create_func { public: - virtual Item* create(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create(THD *thd, LEX_STRING name, List *item_list); /** Builder method, with three arguments. @@ -149,7 +149,7 @@ public: @param arg3 The third argument of the function @return An item representing the function call */ - virtual Item* create(THD *thd, Item *arg1, Item *arg2, Item *arg3) = 0; + virtual Item *create(THD *thd, Item *arg1, Item *arg2, Item *arg3) = 0; protected: /** Constructor. */ @@ -166,7 +166,7 @@ protected: class Create_sp_func : public Create_qfunc { public: - virtual Item* create(THD *thd, LEX_STRING db, LEX_STRING name, + virtual Item *create(THD *thd, LEX_STRING db, LEX_STRING name, bool use_explicit_name, List *item_list); static Create_sp_func s_singleton; @@ -189,7 +189,7 @@ protected: class Create_func_no_geom : public Create_func { public: - virtual Item* create(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create(THD *thd, LEX_STRING name, List *item_list); /** Singleton. */ static Create_func_no_geom s_singleton; @@ -212,7 +212,7 @@ protected: class Create_func_abs : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_abs s_singleton; @@ -225,7 +225,7 @@ protected: class Create_func_acos : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_acos s_singleton; @@ -238,7 +238,7 @@ protected: class Create_func_addtime : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_addtime s_singleton; @@ -251,7 +251,7 @@ protected: class Create_func_aes_encrypt : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_aes_encrypt s_singleton; @@ -264,7 +264,7 @@ protected: class Create_func_aes_decrypt : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_aes_decrypt s_singleton; @@ -278,7 +278,7 @@ protected: class Create_func_area : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_area s_singleton; @@ -293,7 +293,7 @@ protected: class Create_func_as_wkb : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_as_wkb s_singleton; @@ -308,7 +308,7 @@ protected: class Create_func_as_wkt : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_as_wkt s_singleton; @@ -322,7 +322,7 @@ protected: class Create_func_asin : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_asin s_singleton; @@ -335,7 +335,7 @@ protected: class Create_func_atan : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_atan s_singleton; @@ -348,7 +348,7 @@ protected: class Create_func_benchmark : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_benchmark s_singleton; @@ -361,7 +361,7 @@ protected: class Create_func_bin : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_bin s_singleton; @@ -374,7 +374,7 @@ protected: class Create_func_bit_count : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_bit_count s_singleton; @@ -387,7 +387,7 @@ protected: class Create_func_bit_length : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_bit_length s_singleton; @@ -400,7 +400,7 @@ protected: class Create_func_ceiling : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg); + virtual Item *create(THD *thd, Item *arg1); static Create_func_ceiling s_singleton; @@ -414,7 +414,7 @@ protected: class Create_func_centroid : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_centroid s_singleton; @@ -428,7 +428,7 @@ protected: class Create_func_char_length : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_char_length s_singleton; @@ -441,7 +441,7 @@ protected: class Create_func_coercibility : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_coercibility s_singleton; @@ -454,7 +454,7 @@ protected: class Create_func_compress : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_compress s_singleton; @@ -467,7 +467,7 @@ protected: class Create_func_concat : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_concat s_singleton; @@ -480,7 +480,7 @@ protected: class Create_func_concat_ws : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_concat_ws s_singleton; @@ -493,7 +493,7 @@ protected: class Create_func_connection_id : public Create_func_arg0 { public: - virtual Item* create(THD *thd); + virtual Item *create(THD *thd); static Create_func_connection_id s_singleton; @@ -507,7 +507,7 @@ protected: class Create_func_contains : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_contains s_singleton; @@ -521,7 +521,7 @@ protected: class Create_func_conv : public Create_func_arg3 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2, Item *arg3); + virtual Item *create(THD *thd, Item *arg1, Item *arg2, Item *arg3); static Create_func_conv s_singleton; @@ -534,7 +534,7 @@ protected: class Create_func_convert_tz : public Create_func_arg3 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2, Item *arg3); + virtual Item *create(THD *thd, Item *arg1, Item *arg2, Item *arg3); static Create_func_convert_tz s_singleton; @@ -547,7 +547,7 @@ protected: class Create_func_cos : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_cos s_singleton; @@ -560,7 +560,7 @@ protected: class Create_func_cot : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_cot s_singleton; @@ -573,7 +573,7 @@ protected: class Create_func_crc32 : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_crc32 s_singleton; @@ -587,7 +587,7 @@ protected: class Create_func_crosses : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_crosses s_singleton; @@ -601,7 +601,7 @@ protected: class Create_func_date_format : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_date_format s_singleton; @@ -614,7 +614,7 @@ protected: class Create_func_datediff : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_datediff s_singleton; @@ -627,7 +627,7 @@ protected: class Create_func_dayname : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_dayname s_singleton; @@ -640,7 +640,7 @@ protected: class Create_func_dayofmonth : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_dayofmonth s_singleton; @@ -653,7 +653,7 @@ protected: class Create_func_dayofweek : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_dayofweek s_singleton; @@ -666,7 +666,7 @@ protected: class Create_func_dayofyear : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_dayofyear s_singleton; @@ -679,7 +679,7 @@ protected: class Create_func_decode : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_decode s_singleton; @@ -692,7 +692,7 @@ protected: class Create_func_degrees : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_degrees s_singleton; @@ -705,7 +705,7 @@ protected: class Create_func_des_decrypt : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_des_decrypt s_singleton; @@ -718,7 +718,7 @@ protected: class Create_func_des_encrypt : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_des_encrypt s_singleton; @@ -732,7 +732,7 @@ protected: class Create_func_dimension : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_dimension s_singleton; @@ -747,7 +747,7 @@ protected: class Create_func_disjoint : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_disjoint s_singleton; @@ -761,7 +761,7 @@ protected: class Create_func_elt : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_elt s_singleton; @@ -774,7 +774,7 @@ protected: class Create_func_encode : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_encode s_singleton; @@ -787,7 +787,7 @@ protected: class Create_func_encrypt : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_encrypt s_singleton; @@ -801,7 +801,7 @@ protected: class Create_func_endpoint : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_endpoint s_singleton; @@ -816,7 +816,7 @@ protected: class Create_func_envelope : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_envelope s_singleton; @@ -831,7 +831,7 @@ protected: class Create_func_equals : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_equals s_singleton; @@ -845,7 +845,7 @@ protected: class Create_func_exp : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_exp s_singleton; @@ -858,7 +858,7 @@ protected: class Create_func_export_set : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_export_set s_singleton; @@ -872,7 +872,7 @@ protected: class Create_func_exteriorring : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_exteriorring s_singleton; @@ -886,7 +886,7 @@ protected: class Create_func_field : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_field s_singleton; @@ -899,7 +899,7 @@ protected: class Create_func_find_in_set : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_find_in_set s_singleton; @@ -912,7 +912,7 @@ protected: class Create_func_floor : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_floor s_singleton; @@ -925,7 +925,7 @@ protected: class Create_func_format : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_format s_singleton; @@ -938,7 +938,7 @@ protected: class Create_func_found_rows : public Create_func_arg0 { public: - virtual Item* create(THD *thd); + virtual Item *create(THD *thd); static Create_func_found_rows s_singleton; @@ -951,7 +951,7 @@ protected: class Create_func_from_days : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_from_days s_singleton; @@ -964,7 +964,7 @@ protected: class Create_func_from_unixtime : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_from_unixtime s_singleton; @@ -978,7 +978,7 @@ protected: class Create_func_geometry_from_text : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_geometry_from_text s_singleton; @@ -993,7 +993,7 @@ protected: class Create_func_geometry_from_wkb : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_geometry_from_wkb s_singleton; @@ -1008,7 +1008,7 @@ protected: class Create_func_geometry_type : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_geometry_type s_singleton; @@ -1023,7 +1023,7 @@ protected: class Create_func_geometryn : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_geometryn s_singleton; @@ -1037,7 +1037,7 @@ protected: class Create_func_get_lock : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_get_lock s_singleton; @@ -1051,7 +1051,7 @@ protected: class Create_func_glength : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_glength s_singleton; @@ -1065,7 +1065,7 @@ protected: class Create_func_greatest : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_greatest s_singleton; @@ -1078,7 +1078,7 @@ protected: class Create_func_hex : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_hex s_singleton; @@ -1091,7 +1091,7 @@ protected: class Create_func_ifnull : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_ifnull s_singleton; @@ -1104,7 +1104,7 @@ protected: class Create_func_inet_ntoa : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_inet_ntoa s_singleton; @@ -1117,7 +1117,7 @@ protected: class Create_func_inet_aton : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_inet_aton s_singleton; @@ -1130,7 +1130,7 @@ protected: class Create_func_instr : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_instr s_singleton; @@ -1144,7 +1144,7 @@ protected: class Create_func_interiorringn : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_interiorringn s_singleton; @@ -1159,7 +1159,7 @@ protected: class Create_func_intersects : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_intersects s_singleton; @@ -1173,7 +1173,7 @@ protected: class Create_func_is_free_lock : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_is_free_lock s_singleton; @@ -1186,7 +1186,7 @@ protected: class Create_func_is_used_lock : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_is_used_lock s_singleton; @@ -1200,7 +1200,7 @@ protected: class Create_func_isclosed : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_isclosed s_singleton; @@ -1215,7 +1215,7 @@ protected: class Create_func_isempty : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_isempty s_singleton; @@ -1229,7 +1229,7 @@ protected: class Create_func_isnull : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_isnull s_singleton; @@ -1243,7 +1243,7 @@ protected: class Create_func_issimple : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_issimple s_singleton; @@ -1257,7 +1257,7 @@ protected: class Create_func_last_day : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_last_day s_singleton; @@ -1270,7 +1270,7 @@ protected: class Create_func_last_insert_id : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_last_insert_id s_singleton; @@ -1283,7 +1283,7 @@ protected: class Create_func_lcase : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_lcase s_singleton; @@ -1296,7 +1296,7 @@ protected: class Create_func_least : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_least s_singleton; @@ -1309,7 +1309,7 @@ protected: class Create_func_length : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_length s_singleton; @@ -1322,7 +1322,7 @@ protected: class Create_func_ln : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_ln s_singleton; @@ -1335,7 +1335,7 @@ protected: class Create_func_load_file : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_load_file s_singleton; @@ -1348,7 +1348,7 @@ protected: class Create_func_locate : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_locate s_singleton; @@ -1361,7 +1361,7 @@ protected: class Create_func_log : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_log s_singleton; @@ -1374,7 +1374,7 @@ protected: class Create_func_log10 : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_log10 s_singleton; @@ -1387,7 +1387,7 @@ protected: class Create_func_log2 : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_log2 s_singleton; @@ -1400,7 +1400,7 @@ protected: class Create_func_lpad : public Create_func_arg3 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2, Item *arg3); + virtual Item *create(THD *thd, Item *arg1, Item *arg2, Item *arg3); static Create_func_lpad s_singleton; @@ -1413,7 +1413,7 @@ protected: class Create_func_ltrim : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_ltrim s_singleton; @@ -1426,7 +1426,7 @@ protected: class Create_func_makedate : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_makedate s_singleton; @@ -1439,7 +1439,7 @@ protected: class Create_func_maketime : public Create_func_arg3 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2, Item *arg3); + virtual Item *create(THD *thd, Item *arg1, Item *arg2, Item *arg3); static Create_func_maketime s_singleton; @@ -1452,7 +1452,7 @@ protected: class Create_func_make_set : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_make_set s_singleton; @@ -1465,7 +1465,7 @@ protected: class Create_func_master_pos_wait : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_master_pos_wait s_singleton; @@ -1478,7 +1478,7 @@ protected: class Create_func_md5 : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_md5 s_singleton; @@ -1491,7 +1491,7 @@ protected: class Create_func_monthname : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_monthname s_singleton; @@ -1504,7 +1504,7 @@ protected: class Create_func_name_const : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_name_const s_singleton; @@ -1517,7 +1517,7 @@ protected: class Create_func_nullif : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_nullif s_singleton; @@ -1531,7 +1531,7 @@ protected: class Create_func_numgeometries : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_numgeometries s_singleton; @@ -1546,7 +1546,7 @@ protected: class Create_func_numinteriorring : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_numinteriorring s_singleton; @@ -1561,7 +1561,7 @@ protected: class Create_func_numpoints : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_numpoints s_singleton; @@ -1575,7 +1575,7 @@ protected: class Create_func_oct : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_oct s_singleton; @@ -1588,7 +1588,7 @@ protected: class Create_func_ord : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_ord s_singleton; @@ -1602,7 +1602,7 @@ protected: class Create_func_overlaps : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_overlaps s_singleton; @@ -1616,7 +1616,7 @@ protected: class Create_func_period_add : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_period_add s_singleton; @@ -1629,7 +1629,7 @@ protected: class Create_func_period_diff : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_period_diff s_singleton; @@ -1642,7 +1642,7 @@ protected: class Create_func_pi : public Create_func_arg0 { public: - virtual Item* create(THD *thd); + virtual Item *create(THD *thd); static Create_func_pi s_singleton; @@ -1656,7 +1656,7 @@ protected: class Create_func_pointn : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_pointn s_singleton; @@ -1670,7 +1670,7 @@ protected: class Create_func_pow : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_pow s_singleton; @@ -1683,7 +1683,7 @@ protected: class Create_func_quote : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_quote s_singleton; @@ -1696,7 +1696,7 @@ protected: class Create_func_radians : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_radians s_singleton; @@ -1709,7 +1709,7 @@ protected: class Create_func_rand : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_rand s_singleton; @@ -1722,7 +1722,7 @@ protected: class Create_func_release_lock : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_release_lock s_singleton; @@ -1735,7 +1735,7 @@ protected: class Create_func_reverse : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_reverse s_singleton; @@ -1748,7 +1748,7 @@ protected: class Create_func_round : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_round s_singleton; @@ -1761,7 +1761,7 @@ protected: class Create_func_row_count : public Create_func_arg0 { public: - virtual Item* create(THD *thd); + virtual Item *create(THD *thd); static Create_func_row_count s_singleton; @@ -1774,7 +1774,7 @@ protected: class Create_func_rpad : public Create_func_arg3 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2, Item *arg3); + virtual Item *create(THD *thd, Item *arg1, Item *arg2, Item *arg3); static Create_func_rpad s_singleton; @@ -1787,7 +1787,7 @@ protected: class Create_func_rtrim : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_rtrim s_singleton; @@ -1800,7 +1800,7 @@ protected: class Create_func_sec_to_time : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_sec_to_time s_singleton; @@ -1813,7 +1813,7 @@ protected: class Create_func_sha : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_sha s_singleton; @@ -1826,7 +1826,7 @@ protected: class Create_func_sign : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_sign s_singleton; @@ -1839,7 +1839,7 @@ protected: class Create_func_sin : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_sin s_singleton; @@ -1852,7 +1852,7 @@ protected: class Create_func_sleep : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_sleep s_singleton; @@ -1865,7 +1865,7 @@ protected: class Create_func_soundex : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_soundex s_singleton; @@ -1878,7 +1878,7 @@ protected: class Create_func_space : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_space s_singleton; @@ -1891,7 +1891,7 @@ protected: class Create_func_sqrt : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_sqrt s_singleton; @@ -1905,7 +1905,7 @@ protected: class Create_func_srid : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_srid s_singleton; @@ -1920,7 +1920,7 @@ protected: class Create_func_startpoint : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_startpoint s_singleton; @@ -1934,7 +1934,7 @@ protected: class Create_func_str_to_date : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_str_to_date s_singleton; @@ -1947,7 +1947,7 @@ protected: class Create_func_strcmp : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_strcmp s_singleton; @@ -1960,7 +1960,7 @@ protected: class Create_func_substr_index : public Create_func_arg3 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2, Item *arg3); + virtual Item *create(THD *thd, Item *arg1, Item *arg2, Item *arg3); static Create_func_substr_index s_singleton; @@ -1973,7 +1973,7 @@ protected: class Create_func_subtime : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_subtime s_singleton; @@ -1986,7 +1986,7 @@ protected: class Create_func_tan : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_tan s_singleton; @@ -1999,7 +1999,7 @@ protected: class Create_func_time_format : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_time_format s_singleton; @@ -2012,7 +2012,7 @@ protected: class Create_func_time_to_sec : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_time_to_sec s_singleton; @@ -2025,7 +2025,7 @@ protected: class Create_func_timediff : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_timediff s_singleton; @@ -2038,7 +2038,7 @@ protected: class Create_func_to_days : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_to_days s_singleton; @@ -2052,7 +2052,7 @@ protected: class Create_func_touches : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_touches s_singleton; @@ -2066,7 +2066,7 @@ protected: class Create_func_ucase : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_ucase s_singleton; @@ -2079,7 +2079,7 @@ protected: class Create_func_uncompress : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_uncompress s_singleton; @@ -2092,7 +2092,7 @@ protected: class Create_func_uncompressed_length : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_uncompressed_length s_singleton; @@ -2105,7 +2105,7 @@ protected: class Create_func_unhex : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_unhex s_singleton; @@ -2118,7 +2118,7 @@ protected: class Create_func_unix_timestamp : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_unix_timestamp s_singleton; @@ -2131,7 +2131,7 @@ protected: class Create_func_uuid : public Create_func_arg0 { public: - virtual Item* create(THD *thd); + virtual Item *create(THD *thd); static Create_func_uuid s_singleton; @@ -2157,7 +2157,7 @@ protected: class Create_func_version : public Create_func_arg0 { public: - virtual Item* create(THD *thd); + virtual Item *create(THD *thd); static Create_func_version s_singleton; @@ -2170,7 +2170,7 @@ protected: class Create_func_weekday : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_weekday s_singleton; @@ -2183,7 +2183,7 @@ protected: class Create_func_weekofyear : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_weekofyear s_singleton; @@ -2197,7 +2197,7 @@ protected: class Create_func_within : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_within s_singleton; @@ -2212,7 +2212,7 @@ protected: class Create_func_x : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_x s_singleton; @@ -2226,7 +2226,7 @@ protected: class Create_func_xml_extractvalue : public Create_func_arg2 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2); + virtual Item *create(THD *thd, Item *arg1, Item *arg2); static Create_func_xml_extractvalue s_singleton; @@ -2239,7 +2239,7 @@ protected: class Create_func_xml_update : public Create_func_arg3 { public: - virtual Item* create(THD *thd, Item *arg1, Item *arg2, Item *arg3); + virtual Item *create(THD *thd, Item *arg1, Item *arg2, Item *arg3); static Create_func_xml_update s_singleton; @@ -2253,7 +2253,7 @@ protected: class Create_func_y : public Create_func_arg1 { public: - virtual Item* create(THD *thd, Item *arg1); + virtual Item *create(THD *thd, Item *arg1); static Create_func_y s_singleton; @@ -2267,7 +2267,7 @@ protected: class Create_func_year_week : public Create_native_func { public: - virtual Item* create_native(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create_native(THD *thd, LEX_STRING name, List *item_list); static Create_func_year_week s_singleton; diff --git a/sql/item_create.h b/sql/item_create.h index 7ace4032515..a3ba6bd26a6 100644 --- a/sql/item_create.h +++ b/sql/item_create.h @@ -53,7 +53,7 @@ public: @param item_list The list of arguments to the function, can be NULL @return An item representing the parsed function call, or NULL */ - virtual Item* create(THD *thd, LEX_STRING name, List *item_list) = 0; + virtual Item *create(THD *thd, LEX_STRING name, List *item_list) = 0; protected: /** Constructor */ @@ -80,7 +80,7 @@ public: @param item_list The list of arguments to the function, can be NULL @return An item representing the parsed function call */ - virtual Item* create(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create(THD *thd, LEX_STRING name, List *item_list); /** 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 { public: - virtual Item* create(THD *thd, LEX_STRING name, List *item_list); + virtual Item *create(THD *thd, LEX_STRING name, List *item_list); /** 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 @return An item representing the parsed function call */ - Item* create(THD *thd, udf_func *fct, List *item_list); + Item *create(THD *thd, udf_func *fct, List *item_list); /** Singleton. */ static Create_udf_func s_singleton; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 1d042860d73..6d4207e89ec 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -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 && unit_arg->fake_select_lex->test_limit()) diff --git a/sql/lock.cc b/sql/lock.cc index 20fb7d73c1c..8b98c2303a8 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -472,6 +472,9 @@ void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock) unlock_external() we call handler::external_lock(F_UNLCK) only 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 effect is desired. */ @@ -1174,8 +1177,9 @@ bool lock_table_names_exclusively(THD *thd, TABLE_LIST *table_list) /** @brief Test is 'table' is protected by an exclusive name lock. - @param[in] thd The current thread handler - @param[in] table Table container containing the single table to be tested + @param[in] thd The current thread handler + @param[in] table_list Table container containing the single table to be + tested @note Needs to be protected by LOCK_open mutex. @@ -1201,8 +1205,9 @@ is_table_name_exclusively_locked_by_this_thread(THD *thd, /** @brief Test is 'table key' is protected by an exclusive name lock. - @param[in] thd The current thread handler. - @param[in] table Table container containing the single table to be tested. + @param[in] thd The current thread handler. + @param[in] key + @param[in] key_length @note Needs to be protected by LOCK_open mutex diff --git a/sql/sp.cc b/sql/sp.cc index 372aa9c6780..7b69842669f 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -84,7 +84,7 @@ class Stored_routine_creation_ctx : public Stored_program_creation_ctx, { public: 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: virtual Stored_program_creation_ctx *clone(MEM_ROOT *mem_root) diff --git a/sql/sp_head.h b/sql/sp_head.h index f6764fbc90e..41cf8167376 100644 --- a/sql/sp_head.h +++ b/sql/sp_head.h @@ -186,7 +186,7 @@ public: LEX_STRING m_qname; // db.name /** 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 */ LEX_STRING m_sroutines_key; diff --git a/sql/sql_analyse.cc b/sql/sql_analyse.cc index 6b4aaa26236..490cc5e28c1 100644 --- a/sql/sql_analyse.cc +++ b/sql/sql_analyse.cc @@ -668,7 +668,7 @@ void field_ulonglong::add() } // field_ulonglong::add -int analyse::send_row(List &field_list __attribute__((unused))) +int analyse::send_row(List & /* field_list */) { field_info **f = f_info; diff --git a/sql/sql_analyse.h b/sql/sql_analyse.h index ae5d88bf93e..827b6f4b217 100644 --- a/sql/sql_analyse.h +++ b/sql/sql_analyse.h @@ -348,7 +348,7 @@ public: } virtual void add() {} virtual bool change_columns(List &fields); - virtual int send_row(List &fields); + virtual int send_row(List &field_list); virtual void end_group(void) {} virtual bool end_of_records(void); friend Procedure *proc_analyse_init(THD *thd, ORDER *param, diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 24c6979c0f6..cdec96a8526 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2148,9 +2148,9 @@ bool lock_table_name_if_not_cached(THD *thd, const char *db, @brief Check that table exists in table definition cache, on disk or in some storage engine. - @param thd Thread context - @param table Table list element - @param exists[out] Out parameter which is set to TRUE if table + @param thd Thread context + @param table Table list element + @param[out] exists Out parameter which is set to TRUE if table exists and to FALSE otherwise. @note This function assumes that caller owns LOCK_open mutex. diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 575db5b80f7..23e18f85a3c 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -1350,7 +1350,7 @@ static void mysql_change_db_impl(THD *thd, @brief Change the current database. @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 switch to NULL db if the specified database is not available anymore. Corresponding warning will be diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index c83c7a1c894..8d13e3c7554 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -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 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) :drop_list(rhs.drop_list, mem_root), alter_list(rhs.alter_list, mem_root), diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 11273bba314..94feddf6e77 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -859,8 +859,8 @@ public: uint no_parts; enum_alter_table_change_level change_level; Create_field *datetime_field; - bool error_if_not_empty; - + bool error_if_not_empty; + Alter_info() : flags(0), @@ -887,16 +887,6 @@ public: datetime_field= 0; 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); private: Alter_info &operator=(const Alter_info &rhs); // not implemented @@ -1102,8 +1092,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. + In addition to consuming the input stream, this class performs some comment pre processing, by filtering out out of bound special text from the query input stream. @@ -1113,6 +1104,7 @@ enum enum_comment_state is the pre-processed buffer that contains only the query text that should be seen once out-of-bound data is removed. */ + class Lex_input_stream { public: @@ -1121,6 +1113,7 @@ public: /** Set the echo mode. + When echo is true, characters parsed from the raw input stream are preserved. When false, characters parsed are silently ignored. @param echo the echo mode. diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index d38c9bd8643..cef551b812b 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -5370,11 +5370,12 @@ void mysql_init_multi_delete(LEX *lex) /** Parse a query. - @param thd Current thread - @param inBuf Begining of the query text - @param length Length of the query text - @param [out] semicolon For multi queries, position of the character of - the next query in the query text. + + @param thd Current thread + @param inBuf Begining of the query text + @param length Length of 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, diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index 0d088063462..56aef9f9b95 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -2444,7 +2444,7 @@ void plugin_thdvar_cleanup(THD *thd) /** @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 that only string values with PLUGIN_VAR_MEMALLOC are allocated and must be freed. diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index a97bd908468..6b60f89b8e3 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -112,7 +112,6 @@ public: /****************************************************************************/ /** - @class Prepared_statement @brief Prepared_statement: a statement that can contain placeholders */ diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 5a1619aa5cf..9df652a679e 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2459,8 +2459,8 @@ static COND * make_cond_for_info_schema(COND *cond, TABLE_LIST *table) @param[in] thd thread handler @param[in] cond WHERE condition - @param[in] table I_S table - @param[in, out] lookup_field_vals Struct which holds lookup values + @param[in] tables I_S table + @param[in, out] lookup_field_values Struct which holds lookup values @return void */ diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index fa0154dc39e..ce26b025430 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -1882,7 +1882,7 @@ end: @param thd @param event - @param time_type, + @param time_type @param old_row_is_record1 @return Error status. @@ -2074,9 +2074,9 @@ process_unknown_string(char *&unknown_key, uchar* base, MEM_ROOT *mem_root, /** Contruct path to TRN-file. - @param thd[in] Thread context. - @param trg_name[in] Trigger name. - @param trn_path[out] Variable to store constructed path + @param[in] thd Thread context. + @param[in] trg_name Trigger name. + @param[out] trn_path Variable to store constructed 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. - @param thd[in] Thread context. - @param trg_name[in] Trigger name. - @param trn_path[in] Path to the corresponding TRN-file. - @param tbl_name[out] Variable to store retrieved table name. + @param[in] thd Thread context. + @param[in] trg_name Trigger name. + @param[in] trn_path Path to the corresponding TRN-file. + @param[out] tbl_name Variable to store retrieved table name. @return Error status. @retval FALSE on success. diff --git a/sql/sql_update.cc b/sql/sql_update.cc index cb3f2fece89..d4df805d006 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -86,10 +86,10 @@ static bool check_fields(THD *thd, List &items) /** @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 - 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 - record with a proper read_set. + 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 + all fields of the key value in record[0], we need to re-read the + record with a proper read_set. @param[in] error error number @param[in] table table diff --git a/sql/table.h b/sql/table.h index ffe7350f250..5ef2467341a 100644 --- a/sql/table.h +++ b/sql/table.h @@ -157,7 +157,7 @@ enum enum_table_category - FLUSH TABLES WITH READ LOCK - SET GLOBAL READ_ONLY = ON do not apply to this table. - Note that LOCK TABLE FOR READ/WRITE + Note that LOCK TABLE t FOR READ/WRITE can be used on temporary tables. Temporary tables are not part of the table cache. */ @@ -166,7 +166,7 @@ enum enum_table_category /** User table. These tables do honor: - - LOCK TABLE FOR READ/WRITE + - LOCK TABLE t FOR READ/WRITE - FLUSH TABLES WITH READ LOCK - SET GLOBAL READ_ONLY = ON User tables are cached in the table cache. @@ -176,7 +176,7 @@ enum enum_table_category /** System table, maintained by the server. These tables do honor: - - LOCK TABLE FOR READ/WRITE + - LOCK TABLE t FOR READ/WRITE - FLUSH TABLES WITH READ LOCK - SET GLOBAL READ_ONLY = ON 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 to inspect the system metadata. These tables do *not* honor: - - LOCK TABLE FOR READ/WRITE + - LOCK TABLE t FOR READ/WRITE - FLUSH TABLES WITH READ LOCK - SET GLOBAL READ_ONLY = ON 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 to inspect the system performance data. These tables do *not* honor: - - LOCK TABLE FOR READ/WRITE + - LOCK TABLE t FOR READ/WRITE - FLUSH TABLES WITH READ LOCK - SET GLOBAL READ_ONLY = ON as there is no point in locking explicitely From 2537a87fb541e8685aa5021bb745cbfdf9216eec Mon Sep 17 00:00:00 2001 From: "kostja@bodhi.(none)" <> Date: Wed, 15 Aug 2007 19:08:44 +0400 Subject: [PATCH 06/15] Provide initial module structure to Doxygen. --- sql/event_data_objects.cc | 8 ++++++++ sql/event_data_objects.h | 9 +++++++++ sql/event_db_repository.cc | 9 +++++++++ sql/event_db_repository.h | 13 +++++++++++-- sql/event_queue.cc | 8 ++++++++ sql/event_queue.h | 17 +++++++++++++++++ sql/event_scheduler.cc | 9 +++++++++ sql/event_scheduler.h | 18 +++++++++++++++--- sql/events.cc | 9 +++++++++ sql/events.h | 9 ++++++--- sql/lock.cc | 9 ++++++++- sql/sp_head.h | 9 +++++++++ sql/sql_base.cc | 7 +++++++ sql/sql_lex.h | 7 +++++++ sql/sql_parse.cc | 9 +++++++++ sql/sql_select.cc | 8 ++++++++ sql/sql_yacc.yy | 8 ++++++++ 17 files changed, 157 insertions(+), 9 deletions(-) diff --git a/sql/event_data_objects.cc b/sql/event_data_objects.cc index 2ab77ad6b11..787b04c12c6 100644 --- a/sql/event_data_objects.cc +++ b/sql/event_data_objects.cc @@ -20,6 +20,10 @@ #include "event_db_repository.h" #include "sp_head.h" +/** + @addtogroup Event_Scheduler + @{ +*/ #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) && !sortcmp_lex_string(db, b->dbname, system_charset_info); } + +/** + @} (End of group Event_Scheduler) +*/ diff --git a/sql/event_data_objects.h b/sql/event_data_objects.h index a8e7d1720ca..7a49d1597d6 100644 --- a/sql/event_data_objects.h +++ b/sql/event_data_objects.h @@ -15,6 +15,12 @@ along with this program; if not, write to the Free Software 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_BAD_PARAMS -5 @@ -280,5 +286,8 @@ event_basic_db_equal(LEX_STRING db, Event_basic *et); bool event_basic_identifier_equal(LEX_STRING db, LEX_STRING name, Event_basic *b); +/** + @} (End of group Event_Scheduler) +*/ #endif /* _EVENT_DATA_OBJECTS_H_ */ diff --git a/sql/event_db_repository.cc b/sql/event_db_repository.cc index 96c01ad9a0e..37afbabad43 100644 --- a/sql/event_db_repository.cc +++ b/sql/event_db_repository.cc @@ -20,6 +20,11 @@ #include "events.h" #include "sql_show.h" +/** + @addtogroup Event_Scheduler + @{ +*/ + static const TABLE_FIELD_W_TYPE event_table_fields[ET_FIELD_COUNT] = { @@ -1112,3 +1117,7 @@ Event_db_repository::check_system_tables(THD *thd) DBUG_RETURN(test(ret)); } + +/** + @} (End of group Event_Scheduler) +*/ diff --git a/sql/event_db_repository.h b/sql/event_db_repository.h index b60d2ea7afc..ef778407d1e 100644 --- a/sql/event_db_repository.h +++ b/sql/event_db_repository.h @@ -15,8 +15,14 @@ along with this program; if not, write to the Free Software 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 directly. All public declarations of Events module should be stored in events.h and event_data_objects.h. @@ -119,4 +125,7 @@ private: void operator=(Event_db_repository &); }; +/** + @} (End of group Event_Scheduler) +*/ #endif /* _EVENT_DB_REPOSITORY_H_ */ diff --git a/sql/event_queue.cc b/sql/event_queue.cc index 95f207844fc..71ae5c7652f 100644 --- a/sql/event_queue.cc +++ b/sql/event_queue.cc @@ -17,6 +17,10 @@ #include "event_queue.h" #include "event_data_objects.h" +/** + @addtogroup Event_Scheduler + @{ +*/ #define EVENT_QUEUE_INITIAL_SIZE 30 #define EVENT_QUEUE_EXTENT 30 @@ -749,3 +753,7 @@ Event_queue::dump_internal_status() DBUG_VOID_RETURN; } + +/** + @} (End of group Event_Scheduler) +*/ diff --git a/sql/event_queue.h b/sql/event_queue.h index ac4a4f2bfd7..2870ecb4d0b 100644 --- a/sql/event_queue.h +++ b/sql/event_queue.h @@ -15,12 +15,26 @@ along with this program; if not, write to the Free Software 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_queue_element; class Event_queue_element_for_exec; class THD; +/** + Queue of active events awaiting execution. +*/ + class Event_queue { public: @@ -105,5 +119,8 @@ private: bool mutex_queue_data_attempting_lock; bool waiting_on_cond; }; +/** + @} (End of group Event_Scheduler) +*/ #endif /* _EVENT_QUEUE_H_ */ diff --git a/sql/event_scheduler.cc b/sql/event_scheduler.cc index 3092521fd4c..b03b51f1134 100644 --- a/sql/event_scheduler.cc +++ b/sql/event_scheduler.cc @@ -20,6 +20,11 @@ #include "event_queue.h" #include "event_db_repository.h" +/** + @addtogroup Event_Scheduler + @{ +*/ + #ifdef __GNUC__ #if __GNUC__ >= 2 #define SCHED_FUNC __FUNCTION__ @@ -790,3 +795,7 @@ Event_scheduler::dump_internal_status() DBUG_VOID_RETURN; } + +/** + @} (End of group Event_Scheduler) +*/ diff --git a/sql/event_scheduler.h b/sql/event_scheduler.h index eba66c68d42..0be93a65d33 100644 --- a/sql/event_scheduler.h +++ b/sql/event_scheduler.h @@ -15,11 +15,19 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/** + @addtogroup Event_Scheduler + @{ +*/ /** @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 - event_data_objects.h. + + Declarations of the scheduler thread class + 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 &); }; +/** + @} (End of group Event_Scheduler) +*/ + #endif /* _EVENT_SCHEDULER_H_ */ diff --git a/sql/events.cc b/sql/events.cc index bdb9512647f..5246bccc388 100644 --- a/sql/events.cc +++ b/sql/events.cc @@ -21,6 +21,11 @@ #include "event_scheduler.h" #include "sp_head.h" // for Stored_program_creation_ctx +/** + @addtogroup Event_Scheduler + @{ +*/ + /* TODO list : - CREATE EVENT should not go into binary log! Does it now? The SQL statements @@ -1186,3 +1191,7 @@ end: DBUG_RETURN(ret); } + +/** + @} (End of group Event_Scheduler) +*/ diff --git a/sql/events.h b/sql/events.h index 078ab63041b..2bc87517748 100644 --- a/sql/events.h +++ b/sql/events.h @@ -16,10 +16,13 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /** - @file - A public interface of Events Scheduler module. - @defgroup Event Scheduler + @defgroup Event_Scheduler Event Scheduler + @ingroup Runtime_Environment @{ + + @file events.h + + A public interface of Events_Scheduler module. */ class Event_parse_data; diff --git a/sql/lock.cc b/sql/lock.cc index 8b98c2303a8..f859f028504 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -74,6 +74,11 @@ TODO: #include #include +/** + @defgroup Locking Locking + @{ +*/ + extern HASH open_cache; /* flags for get_lock_data */ @@ -1590,4 +1595,6 @@ void broadcast_refresh(void) VOID(pthread_cond_broadcast(&COND_global_read_lock)); } - +/** + @} (end of group Locking) +*/ diff --git a/sql/sp_head.h b/sql/sp_head.h index 41cf8167376..3a8b41acd4c 100644 --- a/sql/sp_head.h +++ b/sql/sp_head.h @@ -23,6 +23,11 @@ #include +/** + @defgroup Stored_Routines Stored Routines + @ingroup Runtime_Environment + @{ +*/ // Values for the type enum. This reflects the order of the enum declaration // in the CREATE TABLE command. #define TYPE_ENUM_FUNCTION 1 @@ -1322,4 +1327,8 @@ sp_prepare_func_item(THD* thd, Item **it_addr); bool sp_eval_expr(THD *thd, Field *result_field, Item **expr_item_ptr); +/** + @} (end of group Stored_Routines) +*/ + #endif /* _SP_HEAD_H_ */ diff --git a/sql/sql_base.cc b/sql/sql_base.cc index cdec96a8526..e15bc1c3137 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -82,6 +82,10 @@ bool Prelock_error_handler::safely_trapped_errors() return ((m_handled_errors > 0) && (m_unhandled_errors == 0)); } +/** + @defgroup Data_Dictionary Data Dictionary + @{ +*/ TABLE *unused_tables; /* Used by mysql_test */ HASH open_cache; /* Used by mysql_test */ @@ -7802,3 +7806,6 @@ void close_performance_schema_table(THD *thd, Open_tables_state *backup) thd->restore_backup_open_tables_state(backup); } +/** + @} (end of group Data_Dictionary) +*/ diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 94feddf6e77..22c7eb2ffb1 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -13,6 +13,9 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/** + @defgroup Semantic_Analysis Semantic Analysis +*/ /* YACC and LEX Definitions */ @@ -1823,4 +1826,8 @@ extern void trim_whitespace(CHARSET_INFO *cs, LEX_STRING *str); extern bool is_lex_native_function(const LEX_STRING *name); +/** + @} (End of group Semantic_Analysis) +*/ + #endif /* MYSQL_SERVER */ diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index cef551b812b..3e6218c5aa8 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -28,6 +28,11 @@ #include "events.h" #include "sql_trigger.h" +/** + @defgroup Runtime_Environment Runtime Environment + @{ +*/ + /* Used in error handling only */ #define SP_TYPE_STRING(LP) \ ((LP)->sphead->m_type == TYPE_ENUM_FUNCTION ? "FUNCTION" : "PROCEDURE") @@ -7242,3 +7247,7 @@ bool parse_sql(THD *thd, return err_status; } + +/** + @} (end of group Runtime_Environment) +*/ diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 0da3b4af547..14e5beada8b 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -13,6 +13,10 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/** + @defgroup Query_Optimizer Query Optimizer + @{ +*/ /* mysql_select and join optimization */ @@ -16037,3 +16041,7 @@ bool JOIN::change_result(select_result *res) } DBUG_RETURN(FALSE); } + +/** + @} (end of group Query_Optimizer) +*/ diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 3bbb3abaa54..8f66e41b338 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -15,6 +15,11 @@ /* sql_yacc.yy */ +/** + @defgroup Parser Parser + @{ +*/ + %{ /* thd is passed as an argument to yyparse(), and subsequently to yylex(). ** The type will be void*, so it must be cast to (THD*) when used. @@ -12255,3 +12260,6 @@ uninstall: } ; +/** + @} (end of group Parser) +*/ From 4f97c96eb2b52b631f70d05e126f0f99376585a8 Mon Sep 17 00:00:00 2001 From: "kostja@bodhi.(none)" <> Date: Wed, 15 Aug 2007 20:11:16 +0400 Subject: [PATCH 07/15] Add replication group (comments). --- sql/slave.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/sql/slave.h b/sql/slave.h index 731728bde4f..791f95ef7ae 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -16,6 +16,12 @@ #ifndef SLAVE_H #define SLAVE_H +/** + @defgroup Replication Replication + @{ + + @file +*/ #ifdef HAVE_REPLICATION #include "log.h" @@ -214,6 +220,8 @@ extern I_List threads; #define SLAVE_IO 1 #define SLAVE_SQL 2 +/** + @} (end of group Replication) +*/ + #endif - - From 86946eb6a8715bcada1cb393a8861c97e7029d74 Mon Sep 17 00:00:00 2001 From: "kostja@bodhi.(none)" <> Date: Thu, 16 Aug 2007 17:59:12 +0400 Subject: [PATCH 08/15] Fix doxygen warning (declaration and definition mismatch). --- sql/item.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/item.cc b/sql/item.cc index 76aad708d22..e2994bb8615 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -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), state(NO_VALUE), item_result_type(STRING_RESULT), From 97adcb6054e3922dcc98a4d5a6f8c928f1f1f6e7 Mon Sep 17 00:00:00 2001 From: "kostja@bodhi.(none)" <> Date: Thu, 16 Aug 2007 18:07:48 +0400 Subject: [PATCH 09/15] Fix doxygen warning. --- sql/sql_class.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index a08d1abe438..d5159929ecd 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -2423,6 +2423,10 @@ bool Security_context::set_user(char *user_arg) Initialize this security context from the passed in credentials 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 in the thread. In case of success it points to the saved old context, otherwise it points to NULL. From b2716c0dadfba1c901b88ce20cfc6be393765d8a Mon Sep 17 00:00:00 2001 From: "kostja@bodhi.(none)" <> Date: Thu, 16 Aug 2007 19:52:55 +0400 Subject: [PATCH 10/15] Doxygen warnings. --- include/mysql/plugin.h | 2 +- sql/field.cc | 2 +- sql/log_event.h | 2 +- sql/rpl_record.cc | 1 + sql/sql_lex.cc | 6 +++--- sql/sql_lex.h | 4 ++-- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/mysql/plugin.h b/include/mysql/plugin.h index 541fa7dfbe6..048ecb27cd5 100644 --- a/include/mysql/plugin.h +++ b/include/mysql/plugin.h @@ -750,7 +750,7 @@ void *thd_memdup(MYSQL_THD thd, const void* str, unsigned int size); @param thd user thread connection handle @param lex_str pointer to LEX_STRING object to be initialized @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, instead of using lex_str value @return NULL on failure, or pointer to the LEX_STRING object diff --git a/sql/field.cc b/sql/field.cc index acaf1576a8f..7ae8916de71 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -7644,7 +7644,7 @@ uchar *Field_blob::pack(uchar *to, const uchar *from, uint max_length) @param to Destination of the data @param from Source of the data - @param param_data + @param param_data not used @return New pointer into memory based on from + length of the data */ diff --git a/sql/log_event.h b/sql/log_event.h index e22a9785736..9db1d117ff6 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -435,7 +435,7 @@ struct sql_ex_info ((ULL(1) << 14) | (ULL(1) << 26) | (ULL(1) << 27) | (ULL(1) << 19)) #if OPTIONS_WRITTEN_TO_BIN_LOG != EXPECTED_OPTIONS -#error OPTIONS_WRITTEN_TO_BIN_LOG must NOT change their values! +#error 1 #endif #undef EXPECTED_OPTIONS /* You shouldn't use this one */ diff --git a/sql/rpl_record.cc b/sql/rpl_record.cc index 36dcedb3b88..1b6b3adb52b 100644 --- a/sql/rpl_record.cc +++ b/sql/rpl_record.cc @@ -177,6 +177,7 @@ pack_row(TABLE *table, MY_BITMAP const* cols, record on the master side @param rw_set Pointer to bitmap that holds either the read_set or the write_set of the table + @param event_type @retval 0 No error diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 8d13e3c7554..78b4f034f98 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1750,7 +1750,7 @@ void st_select_lex_unit::exclude_tree() '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 @@ -2368,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 */ -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; @@ -2898,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. @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 FALSE No, not a management partition command diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 22c7eb2ffb1..2e72a87c35d 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -1512,9 +1512,9 @@ typedef struct st_lex : public Query_tables_list /** End of SELECT of CREATE VIEW statement */ const char* create_view_select_end; - /** Start of 'ON
', in trigger statements. */ + /** Start of 'ON table', in trigger statements. */ const char* raw_trg_on_table_name_begin; - /** End of 'ON
', in trigger statements. */ + /** End of 'ON table', in trigger statements. */ const char* raw_trg_on_table_name_end; /* Partition info structure filled in by PARTITION BY parse part */ From beb61609a11404d7d2fad1cd8c93f83fb8f8cbc5 Mon Sep 17 00:00:00 2001 From: "kostja@bodhi.(none)" <> Date: Thu, 16 Aug 2007 21:14:47 +0400 Subject: [PATCH 11/15] Fix doxygen warnings. --- include/mysql/plugin.h | 2 +- sql/field.h | 7 ++++++- sql/field_conv.cc | 3 ++- sql/log_event.h | 4 ++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/include/mysql/plugin.h b/include/mysql/plugin.h index 048ecb27cd5..61ed7be738f 100644 --- a/include/mysql/plugin.h +++ b/include/mysql/plugin.h @@ -773,7 +773,7 @@ void thd_get_xid(const MYSQL_THD thd, MYSQL_XID *xid); Invalidate the query cache for a given table. @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 using_trx flag: TRUE if using transactions, FALSE otherwise */ diff --git a/sql/field.h b/sql/field.h index 60f6fc19d76..4ef4898cdb5 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1732,7 +1732,12 @@ class Send_field { */ 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: uchar *from_ptr,*to_ptr; uchar *from_null_ptr,*to_null_ptr; diff --git a/sql/field_conv.cc b/sql/field_conv.cc index 33c7897c3db..16e27bb6cab 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -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 == from->table->s->db_low_byte_first); diff --git a/sql/log_event.h b/sql/log_event.h index 9db1d117ff6..203961c628e 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -435,7 +435,7 @@ struct sql_ex_info ((ULL(1) << 14) | (ULL(1) << 26) | (ULL(1) << 27) | (ULL(1) << 19)) #if OPTIONS_WRITTEN_TO_BIN_LOG != EXPECTED_OPTIONS -#error 1 +#error #endif #undef EXPECTED_OPTIONS /* You shouldn't use this one */ @@ -2549,7 +2549,7 @@ protected: - + From b9fd0eeb5ea02838c931c7bf8e901927d25292f6 Mon Sep 17 00:00:00 2001 From: "kostja@bodhi.(none)" <> Date: Thu, 16 Aug 2007 21:54:41 +0400 Subject: [PATCH 12/15] Last tweak for doxygen cleanup. The number of doxygen warnings is 0 now. --- sql/log_event.h | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sql/log_event.h b/sql/log_event.h index 203961c628e..c93bfa32029 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -13,6 +13,15 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/** + @addtogroup Replication + @{ + + @file + + Binary log event definitions. +*/ + #ifndef _log_event_h #define _log_event_h @@ -435,7 +444,7 @@ struct sql_ex_info ((ULL(1) << 14) | (ULL(1) << 26) | (ULL(1) << 27) | (ULL(1) << 19)) #if OPTIONS_WRITTEN_TO_BIN_LOG != EXPECTED_OPTIONS -#error +#error OPTIONS_WRITTEN_TO_BIN_LOG must NOT change their values! #endif #undef EXPECTED_OPTIONS /* You shouldn't use this one */ @@ -2634,4 +2643,8 @@ static inline bool copy_event_cache_to_file_and_reinit(IO_CACHE *cache, reinit_io_cache(cache, WRITE_CACHE, 0, FALSE, TRUE); } +/** + @} (end of group Replication) +*/ + #endif /* _log_event_h */ From a63738db6c37fb504e8ffbc85f9ffaa116fcc45e Mon Sep 17 00:00:00 2001 From: "davi@moksha.local" <> Date: Fri, 17 Aug 2007 11:34:12 -0300 Subject: [PATCH 13/15] Bug#25856 (HANDLER table OPEN in one connection lock DROP TABLE in another one) mysql_ha_open calls mysql_ha_close on the error path (unsupported) to close the (opened) table before inserting it into the tables hash list handler_tables_hash) but mysql_ha_close only closes tables which are on the hash list, causing the table to be left open and locked. This change moves the table close logic into a separate function that is always called on the error path of mysql_ha_open or on a normal handler close (mysql_ha_close). --- mysql-test/r/lock_multi.result | 7 +++ mysql-test/t/lock_multi.test | 15 +++++++ sql/sql_handler.cc | 80 ++++++++++++++++++++-------------- 3 files changed, 69 insertions(+), 33 deletions(-) diff --git a/mysql-test/r/lock_multi.result b/mysql-test/r/lock_multi.result index e89fbec0aed..4a0f70a7b88 100644 --- a/mysql-test/r/lock_multi.result +++ b/mysql-test/r/lock_multi.result @@ -106,4 +106,11 @@ i ERROR 70100: Query execution was interrupted unlock tables; 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 diff --git a/mysql-test/t/lock_multi.test b/mysql-test/t/lock_multi.test index 8ffa67f8439..b2266c9bff1 100644 --- a/mysql-test/t/lock_multi.test +++ b/mysql-test/t/lock_multi.test @@ -328,4 +328,19 @@ unlock tables; connection default; 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 diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index 300ec7f3c62..eaa0da06630 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -119,6 +119,44 @@ static void mysql_ha_hash_free(TABLE_LIST *tables) 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. @@ -145,7 +183,7 @@ static void mysql_ha_hash_free(TABLE_LIST *tables) bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen) { - TABLE_LIST *hash_tables; + TABLE_LIST *hash_tables = NULL; char *db, *name, *alias; uint dblen, namelen, aliaslen, counter; int error; @@ -197,7 +235,6 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen) { if (! reopen) my_error(ER_ILLEGAL_HA, MYF(0), tables->alias); - mysql_ha_close(thd, tables); goto err; } @@ -225,11 +262,7 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen) /* add to hash */ 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; - } } if (! reopen) @@ -238,13 +271,17 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen) DBUG_RETURN(FALSE); 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_RETURN(TRUE); } /* - Close a HANDLER table. + Close a HANDLER table by alias or table name SYNOPSIS mysql_ha_close() @@ -252,9 +289,8 @@ err: tables A list of tables with the first entry to close. DESCRIPTION - Though this function takes a list of tables, only the first list entry - will be closed. - Broadcasts refresh if it closed the table. + Closes the table that is associated (on the handler tables hash) with the + name (table->alias) of the specified table. RETURN FALSE ok @@ -264,7 +300,6 @@ err: bool mysql_ha_close(THD *thd, TABLE_LIST *tables) { TABLE_LIST *hash_tables; - TABLE **table_ptr; DBUG_ENTER("mysql_ha_close"); DBUG_PRINT("enter",("'%s'.'%s' as '%s'", tables->db, tables->table_name, tables->alias)); @@ -273,28 +308,7 @@ bool mysql_ha_close(THD *thd, TABLE_LIST *tables) (uchar*) tables->alias, strlen(tables->alias) + 1))) { - /* - 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)); - } + mysql_ha_close_table(thd, hash_tables); hash_delete(&thd->handler_tables_hash, (uchar*) hash_tables); } else From a4248c2dd370fd7c64b4fa48085f55fd4fe41272 Mon Sep 17 00:00:00 2001 From: "thek@adventure.(none)" <> Date: Fri, 17 Aug 2007 16:55:20 +0200 Subject: [PATCH 14/15] Bug #30269 Query cache eats memory Although the query cache doesn't support retrieval of statements containing column level access control, it was still possible to cache such statements thus wasting memory. This patch extends the access control check on the target tables to avoid caching a statement with column level restrictions. --- mysql-test/r/query_cache.result | 24 ++++++++++++++++++++++++ mysql-test/t/query_cache.test | 30 +++++++++++++++++++++++++++++- sql/sql_cache.cc | 24 +++++++++++++++++++++--- sql/sql_cache.h | 8 +++++--- 4 files changed, 79 insertions(+), 7 deletions(-) diff --git a/mysql-test/r/query_cache.result b/mysql-test/r/query_cache.result index f1f99012910..ecf7df2d2ae 100644 --- a/mysql-test/r/query_cache.result +++ b/mysql-test/r/query_cache.result @@ -1502,6 +1502,30 @@ a (select count(*) from t2) 3 0 4 0 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_limit=default; set GLOBAL query_cache_min_res_unit=default; diff --git a/mysql-test/t/query_cache.test b/mysql-test/t/query_cache.test index 962f53936a3..7f4d4227f41 100644 --- a/mysql-test/t/query_cache.test +++ b/mysql-test/t/query_cache.test @@ -1096,9 +1096,37 @@ connection default; disconnect user1; disconnect user2; 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_limit=default; set GLOBAL query_cache_min_res_unit=default; set GLOBAL query_cache_size=default; -# End of 5.0 tests +# End of 5.0 tests diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index 33d658ce6a1..4a5bb263a5f 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -2991,14 +2991,31 @@ void Query_cache::double_linked_list_join(Query_cache_block *head_tail, >0 number of tables */ -static TABLE_COUNTER_TYPE process_and_count_tables(TABLE_LIST *tables_used, - uint8 *tables_type) +TABLE_COUNTER_TYPE +Query_cache::process_and_count_tables(THD *thd, TABLE_LIST *tables_used, + uint8 *tables_type) { DBUG_ENTER("process_and_count_tables"); TABLE_COUNTER_TYPE table_count = 0; for (; tables_used; tables_used= tables_used->next_global) { 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) { DBUG_PRINT("qcache", ("view: %s db: %s", @@ -3071,7 +3088,8 @@ Query_cache::is_cacheable(THD *thd, uint32 query_len, char *query, LEX *lex, (long) lex->select_lex.options, (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); if ((thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) && diff --git a/sql/sql_cache.h b/sql/sql_cache.h index bc00f7ea629..34fc3a5c8d5 100644 --- a/sql/sql_cache.h +++ b/sql/sql_cache.h @@ -368,10 +368,12 @@ protected: If query is cacheable return number tables in query (query without tables not cached) */ - static TABLE_COUNTER_TYPE is_cacheable(THD *thd, uint32 query_len, char *query, - LEX *lex, TABLE_LIST *tables_used, - uint8 *tables_type); + LEX *lex, TABLE_LIST *tables_used, + 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); public: From fa7ba431dfecafd2b871558738d8c3ae9d65a317 Mon Sep 17 00:00:00 2001 From: "davi@moksha.local" <> Date: Fri, 17 Aug 2007 17:11:08 -0300 Subject: [PATCH 15/15] Bug#29936 (Stored Procedure DML ignores low_priority_updates setting) This is a follow up for the patch for Bug#26162 "Trigger DML ignores low_priority_updates setting", where the stored procedure ignores the session setting of low_priority_updates. --- sql/lock.cc | 1 + sql/sql_base.cc | 9 ++------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/sql/lock.cc b/sql/lock.cc index f859f028504..d9e9dd31f81 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -857,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) continue; lock_type= table->reginfo.lock_type; + DBUG_ASSERT (lock_type != TL_WRITE_DEFAULT); if (lock_type >= TL_WRITE_ALLOW_WRITE) { *write_lock_used=table; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index e15bc1c3137..3fdf397d412 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2255,7 +2255,6 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root, HASH_SEARCH_STATE state; DBUG_ENTER("open_table"); - DBUG_ASSERT (table_list->lock_type != TL_WRITE_DEFAULT); /* find a unused table in the open table cache */ if (refresh) *refresh=0; @@ -3559,11 +3558,6 @@ int open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags) { 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 processing, link to created temporary table will be put here. @@ -3708,7 +3702,8 @@ int open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags) } 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; process_view_routines:
Incident event format
SymbolSize
(bytes)
Size
(bytes)
Description