diff options
-rw-r--r-- | mysql-test/r/derived.result | 17 | ||||
-rw-r--r-- | mysql-test/t/derived.test | 21 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 6 |
3 files changed, 36 insertions, 8 deletions
diff --git a/mysql-test/r/derived.result b/mysql-test/r/derived.result index 6932e0d5476..d24ac5e898a 100644 --- a/mysql-test/r/derived.result +++ b/mysql-test/r/derived.result @@ -196,13 +196,22 @@ drop table t1,t2; SELECT a.x FROM (SELECT 1 AS x) AS a HAVING a.x = 1; x 1 -create table a1 select 1 as a; -select 2 as a from (select * from a1) b; +create table t1 select 1 as a; +select 2 as a from (select * from t1) b; ERROR 3D000: No Database Selected use test; -select 2 as a from (select * from a1) b; +select 2 as a from (select * from t1) b; a 2 -drop table a1; +drop table t1; select mail_id, if(folder.f_description!='', folder.f_description, folder.f_name) as folder_name, date, address_id, phrase, address, subject from folder, (select mail.mail_id as mail_id, date_format(mail.h_date, '%b %e, %Y %h:%i') as date, mail.folder_id, sender.address_id as address_id, sender.phrase as phrase, sender.address as address, mail.h_subject as subject from mail left join mxa as mxa_sender on mail.mail_id=mxa_sender.mail_id and mxa_sender.type='from' left join address as sender on mxa_sender.address_id=sender.address_id mxa as mxa_recipient, address as recipient, where 1 and mail.mail_id=mxa_recipient.mail_id and mxa_recipient.address_id=recipient.address_id and mxa_recipient.type='to' and match(sender.phrase, sender.address, sender.comment) against ('jeremy' in boolean mode) and match(recipient.phrase, recipient.address, recipient.comment) against ('monty' in boolean mode) order by mail.h_date desc limit 0, 25 ) as query where query.folder_id=folder.folder_id; 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 'mxa as mxa_recipient, address as recipient, where 1 and mail.mail_id=mxa_r' at line 1 +create table t1 (a int); +insert into t1 values (1),(2),(3); +update (select * from t1) as t1 set a = 5; +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 +delete from (select * from t1); +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 '(select * from t1)' at line 1 +insert into (select * from t1) values (5); +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 '(select * from t1) values (5)' at line 1 +drop table t1; diff --git a/mysql-test/t/derived.test b/mysql-test/t/derived.test index 39e61b7caaa..fcaf14a4fa2 100644 --- a/mysql-test/t/derived.test +++ b/mysql-test/t/derived.test @@ -99,13 +99,26 @@ SELECT a.x FROM (SELECT 1 AS x) AS a HAVING a.x = 1; # Test for select if database is not selected. # # Connect without a database -create table a1 select 1 as a; +create table t1 select 1 as a; connect (con1,localhost,mysqltest_1,,*NO-ONE*,$MASTER_MYPORT,master.sock); connection con1; --error 1046 -select 2 as a from (select * from a1) b; +select 2 as a from (select * from t1) b; use test; -select 2 as a from (select * from a1) b; -drop table a1; +select 2 as a from (select * from t1) b; +drop table t1; --error 1064 select mail_id, if(folder.f_description!='', folder.f_description, folder.f_name) as folder_name, date, address_id, phrase, address, subject from folder, (select mail.mail_id as mail_id, date_format(mail.h_date, '%b %e, %Y %h:%i') as date, mail.folder_id, sender.address_id as address_id, sender.phrase as phrase, sender.address as address, mail.h_subject as subject from mail left join mxa as mxa_sender on mail.mail_id=mxa_sender.mail_id and mxa_sender.type='from' left join address as sender on mxa_sender.address_id=sender.address_id mxa as mxa_recipient, address as recipient, where 1 and mail.mail_id=mxa_recipient.mail_id and mxa_recipient.address_id=recipient.address_id and mxa_recipient.type='to' and match(sender.phrase, sender.address, sender.comment) against ('jeremy' in boolean mode) and match(recipient.phrase, recipient.address, recipient.comment) against ('monty' in boolean mode) order by mail.h_date desc limit 0, 25 ) as query where query.folder_id=folder.folder_id; + +# +# UPDATE/DELETE/INSERT of derived tables +# +create table t1 (a int); +insert into t1 values (1),(2),(3); +-- error 1149 +update (select * from t1) as t1 set a = 5; +-- error 1149 +delete from (select * from t1); +-- error 1149 +insert into (select * from t1) values (5); +drop table t1; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 0205d69da00..e17ca17251c 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3060,6 +3060,12 @@ join_table: | '(' SELECT_SYM select_derived ')' opt_table_alias { LEX *lex=Lex; + if (lex->sql_command == SQLCOM_UPDATE) + { + send_error(lex->thd, ER_SYNTAX_ERROR); + YYABORT; + } + SELECT_LEX_UNIT *unit= lex->current_select->master_unit(); lex->current_select= unit->outer_select(); if (!($$= lex->current_select-> |