1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-31 22:22:30 +03:00

reverse order in global select list allow to avoid recursion in derived tables

sql/sql_delete.cc:
  new order in global select list
sql/sql_derived.cc:
  removed recursion from derived tables
sql/sql_insert.cc:
  new order in global select list
sql/sql_lex.h:
  pointer to global select list
sql/sql_select.cc:
  new order in global select list
sql/sql_update.cc:
  new order in global select list
This commit is contained in:
unknown
2002-11-27 01:12:16 +02:00
parent 8079acf080
commit a554151951
7 changed files with 30 additions and 41 deletions

View File

@@ -1316,7 +1316,7 @@ mysql_execute_command(THD *thd)
that is not a SHOW command or a select that only access local
variables, but for now this is probably good enough.
*/
if (tables || lex->select_lex.next_select_in_list())
if (tables || &lex->select_lex != lex->all_selects_list)
mysql_reset_errors(thd);
/*
Save old warning count to be able to send to client how many warnings we
@@ -1353,22 +1353,23 @@ mysql_execute_command(THD *thd)
*/
if (lex->derived_tables)
{
for (SELECT_LEX *sl= &lex->select_lex; sl; sl= sl->next_select_in_list())
if (sl->linkage != DERIVED_TABLE_TYPE)
for (TABLE_LIST *cursor= sl->get_table_list();
cursor;
cursor= cursor->next)
if (cursor->derived && (res=mysql_derived(thd, lex,
(SELECT_LEX_UNIT *)
cursor->derived,
cursor)))
{
if (res < 0 || thd->net.report_error)
send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0);
DBUG_VOID_RETURN;
}
}
if ((lex->select_lex.next_select_in_list() &&
for (SELECT_LEX *sl= lex->all_selects_list;
sl;
sl= sl->next_select_in_list())
for (TABLE_LIST *cursor= sl->get_table_list();
cursor;
cursor= cursor->next)
if (cursor->derived && (res=mysql_derived(thd, lex,
(SELECT_LEX_UNIT *)
cursor->derived,
cursor)))
{
if (res < 0 || thd->net.report_error)
send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0);
DBUG_VOID_RETURN;
}
}
if ((&lex->select_lex != lex->all_selects_list &&
lex->unit.create_total_list(thd, lex, &tables)) ||
(table_rules_on && tables && thd->slave_thread &&
!tables_ok(thd,tables)))
@@ -1415,7 +1416,7 @@ mysql_execute_command(THD *thd)
}
else
thd->send_explain_fields(result);
fix_tables_pointers(select_lex);
fix_tables_pointers(lex->all_selects_list);
res= mysql_explain_union(thd, &thd->lex.unit, result);
MYSQL_LOCK *save_lock= thd->lock;
thd->lock= (MYSQL_LOCK *)0;
@@ -2841,9 +2842,11 @@ mysql_init_query(THD *thd)
lex->value_list.empty();
lex->param_list.empty();
lex->unit.global_parameters= lex->unit.slave= lex->current_select=
&lex->select_lex;
lex->all_selects_list= &lex->select_lex;
lex->select_lex.master= &lex->unit;
lex->select_lex.prev= &lex->unit.slave;
lex->select_lex.link_next= 0;
lex->select_lex.link_prev= (st_select_lex_node**)&(lex->all_selects_list);
lex->olap=lex->describe=0;
lex->derived_tables= false;
thd->check_loops_counter= thd->select_number=
@@ -2896,8 +2899,7 @@ mysql_new_select(LEX *lex, bool move_down)
select_lex->master_unit()->global_parameters= select_lex;
DBUG_ASSERT(lex->current_select->linkage != GLOBAL_OPTIONS_TYPE);
select_lex->include_global(lex->current_select->select_lex()->
next_select_in_list_addr());
select_lex->include_global((st_select_lex_node**)&lex->all_selects_list);
lex->current_select= select_lex;
return 0;
}