From 9f7674c8946997fcdbc93531697a69c5b1a645be Mon Sep 17 00:00:00 2001
From: unknown <bell@laptop.sanja.is.com.ua>
Date: Mon, 6 Oct 2003 13:16:56 +0300
Subject: [PATCH] fix error messages fix derived inside subqueries

mysql-test/r/subselect.result:
  error tex changes whi i forgot to commit
mysql-test/t/derived.test:
  code changing
sql/sql_yacc.yy:
  allow derived inside subselects
---
 mysql-test/r/subselect.result | 28 ++++++++++++++--------------
 mysql-test/t/derived.test     |  4 ++--
 sql/sql_yacc.yy               |  3 ++-
 3 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result
index d29609f5f8..82110e3436 100644
--- a/mysql-test/r/subselect.result
+++ b/mysql-test/r/subselect.result
@@ -295,7 +295,7 @@ Warnings:
 Note	1275	Field or reference 't2.a' of SELECT #2 was resolved in SELECT #1
 Note	1275	Field or reference 't2.a' of SELECT #3 was resolved in SELECT #1
 select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2;
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 create table t6 (patient_uq int, clinic_uq int, index i1 (clinic_uq));
 create table t7( uq int primary key, name char(25));
 insert into t7 values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta");
@@ -354,7 +354,7 @@ SELECT pseudo FROM t8 WHERE pseudo=(SELECT pseudo FROM t8 WHERE pseudo='joce');
 pseudo
 joce
 SELECT pseudo FROM t8 WHERE pseudo=(SELECT pseudo FROM t8 WHERE pseudo LIKE '%joce%');
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 drop table if exists t1,t2,t3,t4,t5,t6,t7,t8;
 CREATE TABLE `t1` (
 `topic` mediumint(8) unsigned NOT NULL default '0',
@@ -384,7 +384,7 @@ SELECT 1 FROM t1 WHERE 1=(SELECT 1 UNION SELECT 1) UNION ALL SELECT 1;
 1
 1
 SELECT 1 FROM t1 WHERE 1=(SELECT 1 UNION ALL SELECT 1) UNION SELECT 1;
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 EXPLAIN SELECT 1 FROM t1 WHERE 1=(SELECT 1 UNION SELECT 1);
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 1	PRIMARY	t1	index	NULL	topic	3	NULL	2	Using index
@@ -471,9 +471,9 @@ UNIQUE KEY `maxnumrep` (`maxnumrep`)
 ) TYPE=MyISAM ROW_FORMAT=FIXED;
 INSERT INTO t1 (numeropost,maxnumrep) VALUES (1,0),(2,1);
 select numeropost as a FROM t1 GROUP BY (SELECT 1 FROM t1 HAVING a=1);
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 select numeropost as a FROM t1 ORDER BY (SELECT 1 FROM t1 HAVING a=1);
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 drop table t1;
 create table t1 (a int);
 insert into t1 values (1),(2),(3);
@@ -486,7 +486,7 @@ drop table t1;
 CREATE TABLE t1 (field char(1) NOT NULL DEFAULT 'b');
 INSERT INTO t1 VALUES ();
 SELECT field FROM t1 WHERE 1=(SELECT 1 UNION ALL SELECT 1 FROM (SELECT 1) a HAVING field='b');
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 drop table t1;
 CREATE TABLE `t1` (
 `numeropost` mediumint(8) unsigned NOT NULL default '0',
@@ -504,7 +504,7 @@ SELECT numreponse, (SELECT numeropost FROM t1 HAVING numreponse=1) FROM (SELECT
 numreponse	(SELECT numeropost FROM t1 HAVING numreponse=1)
 INSERT INTO t1 (numeropost,numreponse,pseudo) VALUES (1,1,'joce'),(1,2,'joce'),(1,3,'test');
 EXPLAIN SELECT numreponse FROM t1 WHERE numeropost='1' AND numreponse=(SELECT 1 FROM t1 WHERE numeropost='1');
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 EXPLAIN SELECT MAX(numreponse) FROM t1 WHERE numeropost='1';
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	Select tables optimized away
@@ -531,7 +531,7 @@ a	b
 update t1 set b= (select b from t1);
 ERROR HY000: You can't specify target table 't1' for update in FROM clause
 update t1 set b= (select b from t2);
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 update t1 set b= (select b from t2 where t1.a = t2.a);
 select * from t1;
 a	b
@@ -554,7 +554,7 @@ a	b
 delete from t1 where b = (select b from t1);
 ERROR HY000: You can't specify target table 't1' for update in FROM clause
 delete from t1 where b = (select b from t2);
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 delete from t1 where b = (select b from t2 where t1.a = t2.a);
 select * from t1;
 a	b
@@ -580,7 +580,7 @@ a	b
 delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t12 where t11.a = t12.a);
 ERROR HY000: You can't specify target table 't12' for update in FROM clause
 delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t2);
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t2 where t11.a = t2.a);
 select * from t11;
 a	b
@@ -599,7 +599,7 @@ insert into t3 values (1),(2);
 INSERT INTO t1 (x) VALUES ((SELECT x FROM t1));
 ERROR HY000: You can't specify target table 't1' for update in FROM clause
 INSERT INTO t1 (x) VALUES ((SELECT b FROM t3));
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 INSERT INTO t1 (x) VALUES ((SELECT a FROM t2));
 select * from t1;
 x
@@ -641,7 +641,7 @@ x	y
 replace into t1 (x, y) VALUES ((SELECT x FROM t1), (SELECT a+1 FROM t2));
 ERROR HY000: You can't specify target table 't1' for update in FROM clause
 replace into t1 (x, y) VALUES ((SELECT a FROM t3), (SELECT a+1 FROM t2));
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 replace into t1 (x, y) VALUES ((SELECT a FROM t2), (SELECT a+1 FROM t2));
 select * from t1;
 x	y
@@ -712,7 +712,7 @@ id
 CREATE TABLE t1 (id int(11) default NULL, KEY id (id)) TYPE=MyISAM CHARSET=latin1;
 INSERT INTO t1 values (1),(1);
 UPDATE t2 SET id=(SELECT * FROM t1);
-ERROR 21000: Subquery returns more than 1 record
+ERROR 21000: Subquery returns more than 1 row
 drop table t2, t1;
 create table t1 (a int);
 insert into t1 values (1),(2),(3);
@@ -1186,7 +1186,7 @@ insert into t1 values (1,0), (2,0), (3,0);
 insert into t2 values (1,1), (2,1), (3,1), (2,2);
 update ignore t1 set b=(select b from t2 where t1.a=t2.a);
 Warnings:
-Error	1241	Subquery returns more than 1 record
+Error	1241	Subquery returns more than 1 row
 select * from t1;
 a	b
 1	1
diff --git a/mysql-test/t/derived.test b/mysql-test/t/derived.test
index fcaf14a4fa..a8583aa5ea 100644
--- a/mysql-test/t/derived.test
+++ b/mysql-test/t/derived.test
@@ -117,8 +117,8 @@ 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
+-- error 1064
 delete from (select * from t1);
--- error 1149
+-- error 1064
 insert into  (select * from t1) values (5);
 drop table t1;
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index e17ca17251..cda22ae533 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -3060,7 +3060,8 @@ join_table:
         | '(' SELECT_SYM select_derived ')' opt_table_alias
 	{
 	  LEX *lex=Lex;
-	  if (lex->sql_command == SQLCOM_UPDATE)
+	  if (lex->sql_command == SQLCOM_UPDATE &&
+	      &lex->select_lex == lex->current_select->outer_select())
 	  {
 	    send_error(lex->thd, ER_SYNTAX_ERROR);
 	    YYABORT;
-- 
2.30.9