merge fixes
This commit is contained in:
commit
566ebb63ce
@ -46,8 +46,6 @@ alter table t8 rename t7;
|
||||
rename table t7 to t9;
|
||||
drop table t1;
|
||||
Got one of the listed errors
|
||||
Warnings:
|
||||
Note 1008 Can't drop database 'test_mysqltest'; database doesn't exist
|
||||
Got one of the listed errors
|
||||
Got one of the listed errors
|
||||
Got one of the listed errors
|
||||
|
@ -103,7 +103,7 @@ a b
|
||||
2 b
|
||||
select found_rows();
|
||||
found_rows()
|
||||
6
|
||||
8
|
||||
explain select a,b from t1 union all select a,b from t2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 4
|
||||
|
@ -272,8 +272,8 @@ protected:
|
||||
|
||||
select_result *result;
|
||||
int res;
|
||||
bool describe, found_rows_for_union,
|
||||
prepared, // prepare phase already performed for UNION (unit)
|
||||
ulong describe, found_rows_for_union;
|
||||
bool prepared, // prepare phase already performed for UNION (unit)
|
||||
optimized, // optimize phase already performed for UNION (unit)
|
||||
executed, // already executed
|
||||
t_and_f; // used for transferring tables_and_fields_initied UNIT:: methods
|
||||
|
@ -1043,6 +1043,7 @@ JOIN::exec()
|
||||
DBUG_ENTER("JOIN::exec");
|
||||
|
||||
error= 0;
|
||||
thd->limit_found_rows= thd->examined_row_count= 0;
|
||||
if (procedure)
|
||||
{
|
||||
if (procedure->change_columns(fields_list) ||
|
||||
@ -1425,6 +1426,8 @@ JOIN::exec()
|
||||
thd->proc_info="Sending data";
|
||||
error= thd->net.report_error ||
|
||||
do_select(curr_join, curr_fields_list, NULL, procedure);
|
||||
thd->limit_found_rows= curr_join->send_records;
|
||||
thd->examined_row_count= curr_join->examined_rows;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
@ -1547,8 +1550,6 @@ err:
|
||||
(join->tmp_join->error=join->error,join->tmp_join):
|
||||
join);
|
||||
|
||||
thd->limit_found_rows= curr_join->send_records;
|
||||
thd->examined_row_count= curr_join->examined_rows;
|
||||
thd->proc_info="end";
|
||||
err= join->cleanup();
|
||||
if (thd->net.report_error)
|
||||
|
@ -187,31 +187,34 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result,
|
||||
|
||||
for (SELECT_LEX *sl= select_cursor; sl; sl= sl->next_select())
|
||||
{
|
||||
JOIN *join= new JOIN(thd, sl->item_list,
|
||||
sl->options | thd->options | SELECT_NO_UNLOCK,
|
||||
union_result);
|
||||
thd->lex.current_select= sl;
|
||||
offset_limit_cnt= sl->offset_limit;
|
||||
select_limit_cnt= sl->select_limit+sl->offset_limit;
|
||||
if (select_limit_cnt < sl->select_limit)
|
||||
select_limit_cnt= HA_POS_ERROR; // no limit
|
||||
if (select_limit_cnt == HA_POS_ERROR && !sl->braces)
|
||||
sl->options&= ~OPTION_FOUND_ROWS;
|
||||
|
||||
res= join->prepare(&sl->ref_pointer_array,
|
||||
(TABLE_LIST*) sl->table_list.first, sl->with_wild,
|
||||
sl->where,
|
||||
((sl->braces) ? sl->order_list.elements : 0) +
|
||||
sl->group_list.elements,
|
||||
(sl->braces) ?
|
||||
(ORDER *)sl->order_list.first : (ORDER *) 0,
|
||||
(ORDER*) sl->group_list.first,
|
||||
sl->having,
|
||||
(ORDER*) NULL,
|
||||
sl, this, t_and_f);
|
||||
t_and_f= 0;
|
||||
if (res || thd->is_fatal_error)
|
||||
goto err;
|
||||
for (SELECT_LEX *sl= select_cursor; sl; sl= sl->next_select())
|
||||
{
|
||||
JOIN *join= new JOIN(thd, sl->item_list,
|
||||
sl->options | thd->options | SELECT_NO_UNLOCK,
|
||||
union_result);
|
||||
thd->lex.current_select= sl;
|
||||
offset_limit_cnt= sl->offset_limit;
|
||||
select_limit_cnt= sl->select_limit+sl->offset_limit;
|
||||
if (select_limit_cnt < sl->select_limit)
|
||||
select_limit_cnt= HA_POS_ERROR; // no limit
|
||||
if (select_limit_cnt == HA_POS_ERROR || sl->braces)
|
||||
sl->options&= ~OPTION_FOUND_ROWS;
|
||||
|
||||
res= join->prepare(&sl->ref_pointer_array,
|
||||
(TABLE_LIST*) sl->table_list.first, sl->with_wild,
|
||||
sl->where,
|
||||
((sl->braces) ? sl->order_list.elements : 0) +
|
||||
sl->group_list.elements,
|
||||
(sl->braces) ?
|
||||
(ORDER *)sl->order_list.first : (ORDER *) 0,
|
||||
(ORDER*) sl->group_list.first,
|
||||
sl->having,
|
||||
(ORDER*) NULL,
|
||||
sl, this, t_and_f);
|
||||
t_and_f= 0;
|
||||
if (res || thd->is_fatal_error)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
item_list.empty();
|
||||
@ -267,12 +270,15 @@ int st_select_lex_unit::exec()
|
||||
select_limit_cnt= sl->select_limit+sl->offset_limit;
|
||||
if (select_limit_cnt < sl->select_limit)
|
||||
select_limit_cnt= HA_POS_ERROR; // no limit
|
||||
if (select_limit_cnt == HA_POS_ERROR)
|
||||
if (select_limit_cnt == HA_POS_ERROR || sl->braces)
|
||||
sl->options&= ~OPTION_FOUND_ROWS;
|
||||
else if (found_rows_for_union)
|
||||
else
|
||||
{
|
||||
rows= sl->select_limit;
|
||||
sl->options|= OPTION_FOUND_ROWS;
|
||||
/*
|
||||
We are doing an union without braces. In this case
|
||||
SQL_CALC_FOUND_ROWS should be done on all sub parts
|
||||
*/
|
||||
sl->options|= found_rows_for_union;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -301,6 +307,7 @@ int st_select_lex_unit::exec()
|
||||
}
|
||||
if (!res)
|
||||
{
|
||||
records_at_start= table->file->records;
|
||||
sl->join->exec();
|
||||
res= sl->join->error;
|
||||
if (!res && union_result->flush())
|
||||
@ -314,10 +321,17 @@ 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+= (sl->join->send_records > rows) ?
|
||||
sl->join->send_records - rows : 0;
|
||||
if (found_rows_for_union & sl->options)
|
||||
{
|
||||
/*
|
||||
This is a union without braces. Remember the number of rows that could
|
||||
also have been part of the result set.
|
||||
We get this from the difference of between total number of possible
|
||||
rows and actual rows added to the temporary table.
|
||||
*/
|
||||
add_rows+= (ulonglong) (thd->limit_found_rows - (table->file->records -
|
||||
records_at_start));
|
||||
}
|
||||
}
|
||||
}
|
||||
optimized= 1;
|
||||
@ -382,12 +396,8 @@ int st_select_lex_unit::exec()
|
||||
(ORDER*) NULL, NULL, (ORDER*) NULL,
|
||||
options | SELECT_NO_UNLOCK,
|
||||
result, this, fake_select_lex, 0);
|
||||
if (found_rows_for_union && !res)
|
||||
{
|
||||
thd->limit_found_rows= table->file->records;
|
||||
if (!select_cursor->braces)
|
||||
thd->limit_found_rows+= add_rows;
|
||||
}
|
||||
if (!res)
|
||||
thd->limit_found_rows = (ulonglong)table->file->records + add_rows;
|
||||
/*
|
||||
Mark for slow query log if any of the union parts didn't use
|
||||
indexes efficiently
|
||||
|
Loading…
x
Reference in New Issue
Block a user