1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-07 00:04:31 +03:00
sql/sql_parse.cc:
  Auto merged
sql/sql_union.cc:
  SCCS merged
This commit is contained in:
unknown
2003-08-20 17:45:04 +03:00
4 changed files with 31 additions and 18 deletions

View File

@@ -123,7 +123,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result,
DBUG_RETURN(0);
prepared= 1;
res= 0;
found_rows_for_union= 0;
found_rows_for_union= first_select_in_union()->options & OPTION_FOUND_ROWS;
TMP_TABLE_PARAM tmp_table_param;
result= sel_result;
t_and_f= tables_and_fields_initied;
@@ -131,13 +131,6 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result,
bzero((char *)&tmp_table_param,sizeof(TMP_TABLE_PARAM));
thd->lex.current_select= select_cursor= first_select_in_union();
/* Global option */
if (((void*)(global_parameters)) == ((void*)this))
{
found_rows_for_union= first_select()->options & OPTION_FOUND_ROWS &&
global_parameters->select_limit;
if (found_rows_for_union)
first_select()->options&= ~OPTION_FOUND_ROWS;
}
if (t_and_f)
{
// Item list and tables will be initialized by mysql_derived
@@ -245,6 +238,7 @@ int st_select_lex_unit::exec()
{
SELECT_LEX *lex_select_save= thd->lex.current_select;
SELECT_LEX *select_cursor=first_select_in_union();
unsigned int add_rows=0;
DBUG_ENTER("st_select_lex_unit::exec");
if (executed && !(dependent || uncacheable))
@@ -261,6 +255,7 @@ int st_select_lex_unit::exec()
}
for (SELECT_LEX *sl= select_cursor; sl; sl= sl->next_select())
{
unsigned int rows;
thd->lex.current_select= sl;
if (optimized)
@@ -273,6 +268,11 @@ int st_select_lex_unit::exec()
select_limit_cnt= HA_POS_ERROR; // no limit
if (select_limit_cnt == HA_POS_ERROR)
sl->options&= ~OPTION_FOUND_ROWS;
else if (found_rows_for_union)
{
rows= thd->select_limit;
sl->options|= OPTION_FOUND_ROWS;
}
/*
As far as union share table space we should reassign table map,
@@ -313,6 +313,8 @@ int st_select_lex_unit::exec()
thd->lex.current_select= lex_select_save;
DBUG_RETURN(res);
}
if (found_rows_for_union && !sl->braces && sl->options & OPTION_FOUND_ROWS)
add_rows+= (thd->limit_found_rows > rows) ? thd->limit_found_rows - rows : 0;
}
}
optimized= 1;
@@ -328,15 +330,17 @@ int st_select_lex_unit::exec()
if (!thd->is_fatal_error) // Check if EOM
{
thd->lex.current_select= fake_select_lex;
offset_limit_cnt= (select_cursor->braces ?
global_parameters->offset_limit : 0);
select_limit_cnt= (select_cursor->braces ?
global_parameters->select_limit+
global_parameters->offset_limit : HA_POS_ERROR);
if (select_limit_cnt < global_parameters->select_limit)
select_limit_cnt= HA_POS_ERROR; // no limit
if (select_cursor->braces)
{
offset_limit_cnt= global_parameters->offset_limit;
select_limit_cnt= global_parameters->select_limit + global_parameters->offset_limit;
if (select_limit_cnt < global_parameters->select_limit)
select_limit_cnt= HA_POS_ERROR; // no limit
}
if (select_limit_cnt == HA_POS_ERROR)
thd->options&= ~OPTION_FOUND_ROWS;
else if (found_rows_for_union && !describe)
thd->options|= OPTION_FOUND_ROWS;
fake_select_lex->ftfunc_list= &empty_list;
fake_select_lex->table_list.link_in_list((byte *)&result_table_list,
(byte **)
@@ -374,7 +378,11 @@ int st_select_lex_unit::exec()
thd->options | SELECT_NO_UNLOCK,
result, this, fake_select_lex, 0);
if (found_rows_for_union && !res)
thd->limit_found_rows = (ulonglong)table->file->records;
{
thd->limit_found_rows= table->file->records;
if (!select_cursor->braces)
thd->limit_found_rows+= add_rows;
}
/*
Mark for slow query log if any of the union parts didn't use
indexes efficiently