Commit 6ed18d1c authored by unknown's avatar unknown

fixed bug of derived table in subselect

fixed bug in error handling


mysql-test/r/subselect.result:
  test of error handling
  test of derived tables inside subselect
mysql-test/t/subselect.test:
  test of error handling
  test of derived tables inside subselect
sql/sql_class.cc:
  fixed error handling error
sql/sql_lex.h:
  fifex layout
sql/sql_parse.cc:
  fixed processing of derived tables
sql/sql_select.cc:
  more quick abort on error
parent 0c593568
...@@ -256,4 +256,12 @@ UNIQUE KEY `maxnumrep` (`maxnumrep`) ...@@ -256,4 +256,12 @@ UNIQUE KEY `maxnumrep` (`maxnumrep`)
INSERT INTO forumconthardwarefr7 (numeropost,maxnumrep) VALUES (1,0),(2,1); INSERT INTO forumconthardwarefr7 (numeropost,maxnumrep) VALUES (1,0),(2,1);
select numeropost as a FROM forumconthardwarefr7 GROUP BY (SELECT 1 FROM forumconthardwarefr7 HAVING a=1); select numeropost as a FROM forumconthardwarefr7 GROUP BY (SELECT 1 FROM forumconthardwarefr7 HAVING a=1);
Subselect returns more than 1 record Subselect returns more than 1 record
select numeropost as a FROM forumconthardwarefr7 ORDER BY (SELECT 1 FROM forumconthardwarefr7 HAVING a=1);
Subselect returns more than 1 record
drop table if exists forumconthardwarefr7; drop table if exists forumconthardwarefr7;
drop table if exists iftest;
CREATE TABLE iftest (field char(1) NOT NULL DEFAULT 'b');
INSERT INTO iftest VALUES ();
SELECT field FROM iftest WHERE 1=(SELECT 1 UNION ALL SELECT 1 FROM (SELECT 1) HAVING field='b');
Subselect returns more than 1 record
drop table iftest;
...@@ -152,4 +152,13 @@ CREATE TABLE `forumconthardwarefr7` ( ...@@ -152,4 +152,13 @@ CREATE TABLE `forumconthardwarefr7` (
INSERT INTO forumconthardwarefr7 (numeropost,maxnumrep) VALUES (1,0),(2,1); INSERT INTO forumconthardwarefr7 (numeropost,maxnumrep) VALUES (1,0),(2,1);
-- error 1240 -- error 1240
select numeropost as a FROM forumconthardwarefr7 GROUP BY (SELECT 1 FROM forumconthardwarefr7 HAVING a=1); select numeropost as a FROM forumconthardwarefr7 GROUP BY (SELECT 1 FROM forumconthardwarefr7 HAVING a=1);
drop table if exists forumconthardwarefr7; -- error 1240
\ No newline at end of file select numeropost as a FROM forumconthardwarefr7 ORDER BY (SELECT 1 FROM forumconthardwarefr7 HAVING a=1);
drop table if exists forumconthardwarefr7;
drop table if exists iftest;
CREATE TABLE iftest (field char(1) NOT NULL DEFAULT 'b');
INSERT INTO iftest VALUES ();
-- error 1240
SELECT field FROM iftest WHERE 1=(SELECT 1 UNION ALL SELECT 1 FROM (SELECT 1) HAVING field='b');
drop table iftest;
...@@ -873,7 +873,6 @@ bool select_singleval_subselect::send_data(List<Item> &items) ...@@ -873,7 +873,6 @@ bool select_singleval_subselect::send_data(List<Item> &items)
DBUG_ENTER("select_singleval_subselect::send_data"); DBUG_ENTER("select_singleval_subselect::send_data");
Item_singleval_subselect *it= (Item_singleval_subselect *)item; Item_singleval_subselect *it= (Item_singleval_subselect *)item;
if (it->assigned()){ if (it->assigned()){
thd->fatal_error= 1;
my_message(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0)); my_message(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0));
DBUG_RETURN(1); DBUG_RETURN(1);
} }
......
...@@ -336,7 +336,7 @@ public: ...@@ -336,7 +336,7 @@ public:
} }
st_select_lex* outer_select(); st_select_lex* outer_select();
st_select_lex* next_select() { return (st_select_lex*) next; } st_select_lex* next_select() { return (st_select_lex*) next; }
st_select_lex* next_select_in_list() st_select_lex* next_select_in_list()
{ {
return (st_select_lex*) link_next; return (st_select_lex*) link_next;
} }
......
...@@ -1334,17 +1334,20 @@ mysql_execute_command(THD *thd) ...@@ -1334,17 +1334,20 @@ mysql_execute_command(THD *thd)
*/ */
if (lex->derived_tables) if (lex->derived_tables)
{ {
for (TABLE_LIST *cursor= tables; for (SELECT_LEX *sl= &lex->select_lex; sl; sl= sl->next_select_in_list())
cursor; if (sl->linkage != DERIVED_TABLE_TYPE)
cursor= cursor->next) for (TABLE_LIST *cursor= sl->get_table_list();
if (cursor->derived && (res=mysql_derived(thd, lex, cursor;
(SELECT_LEX_UNIT *)cursor->derived, cursor= cursor->next)
cursor))) if (cursor->derived && (res=mysql_derived(thd, lex,
{ (SELECT_LEX_UNIT *)
if (res < 0) cursor->derived,
send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0); cursor)))
DBUG_VOID_RETURN; {
} if (res < 0)
send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0);
DBUG_VOID_RETURN;
}
} }
if ((lex->select_lex.next_select_in_list() && if ((lex->select_lex.next_select_in_list() &&
lex->unit.create_total_list(thd, lex, &tables)) || lex->unit.create_total_list(thd, lex, &tables)) ||
......
...@@ -994,7 +994,8 @@ JOIN::exec() ...@@ -994,7 +994,8 @@ JOIN::exec()
} }
having=having_list; // Actually a parameter having=having_list; // Actually a parameter
thd->proc_info="Sending data"; thd->proc_info="Sending data";
error=do_select(this, &fields_list, NULL, procedure); error= thd->net.report_error ||
do_select(this, &fields_list, NULL, procedure);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -1078,7 +1079,7 @@ mysql_select(THD *thd, TABLE_LIST *tables, List<Item> &fields, COND *conds, ...@@ -1078,7 +1079,7 @@ mysql_select(THD *thd, TABLE_LIST *tables, List<Item> &fields, COND *conds,
goto err; goto err;
} }
if (free_join && join->global_optimize()) if (thd->net.report_error || (free_join && join->global_optimize()))
goto err; goto err;
join->exec(); join->exec();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment