manual merge
This commit is contained in:
commit
de1153b5e6
@ -487,3 +487,15 @@ insert into t1 values ('foo');
|
|||||||
prepare stmt FROM 'SELECT char_length (a) FROM t1';
|
prepare stmt FROM 'SELECT char_length (a) FROM t1';
|
||||||
ERROR 42000: FUNCTION test.char_length does not exist
|
ERROR 42000: FUNCTION test.char_length does not exist
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
prepare stmt from "SELECT SQL_CALC_FOUND_ROWS 'foo' UNION SELECT 'bar' LIMIT 0";
|
||||||
|
execute stmt;
|
||||||
|
foo
|
||||||
|
SELECT FOUND_ROWS();
|
||||||
|
FOUND_ROWS()
|
||||||
|
2
|
||||||
|
execute stmt;
|
||||||
|
foo
|
||||||
|
SELECT FOUND_ROWS();
|
||||||
|
FOUND_ROWS()
|
||||||
|
2
|
||||||
|
deallocate prepare stmt;
|
||||||
|
@ -497,3 +497,13 @@ insert into t1 values ('foo');
|
|||||||
prepare stmt FROM 'SELECT char_length (a) FROM t1';
|
prepare stmt FROM 'SELECT char_length (a) FROM t1';
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #6089: FOUND_ROWS returns wrong values when no table/view is used
|
||||||
|
#
|
||||||
|
|
||||||
|
prepare stmt from "SELECT SQL_CALC_FOUND_ROWS 'foo' UNION SELECT 'bar' LIMIT 0";
|
||||||
|
execute stmt;
|
||||||
|
SELECT FOUND_ROWS();
|
||||||
|
execute stmt;
|
||||||
|
SELECT FOUND_ROWS();
|
||||||
|
deallocate prepare stmt;
|
||||||
|
@ -217,8 +217,6 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
|
|||||||
|
|
||||||
thd_arg->lex->current_select= sl;
|
thd_arg->lex->current_select= sl;
|
||||||
set_limit(sl, sl);
|
set_limit(sl, sl);
|
||||||
if (sl->braces)
|
|
||||||
sl->options&= ~OPTION_FOUND_ROWS;
|
|
||||||
|
|
||||||
can_skip_order_by= is_union &&
|
can_skip_order_by= is_union &&
|
||||||
(!sl->braces || select_limit_cnt == HA_POS_ERROR);
|
(!sl->braces || select_limit_cnt == HA_POS_ERROR);
|
||||||
@ -342,10 +340,9 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
|
|||||||
if (arena->is_stmt_prepare())
|
if (arena->is_stmt_prepare())
|
||||||
{
|
{
|
||||||
/* prepare fake select to initialize it correctly */
|
/* prepare fake select to initialize it correctly */
|
||||||
ulong options_tmp= init_prepare_fake_select_lex(thd);
|
(void) init_prepare_fake_select_lex(thd);
|
||||||
/*
|
/*
|
||||||
it should be done only once (because item_list builds only onece
|
Should be done only once (the only item_list per statement).
|
||||||
per statement)
|
|
||||||
*/
|
*/
|
||||||
DBUG_ASSERT(fake_select_lex->join == 0);
|
DBUG_ASSERT(fake_select_lex->join == 0);
|
||||||
if (!(fake_select_lex->join= new JOIN(thd, item_list, thd->options,
|
if (!(fake_select_lex->join= new JOIN(thd, item_list, thd->options,
|
||||||
@ -452,21 +449,14 @@ bool st_select_lex_unit::exec()
|
|||||||
if (select_limit_cnt < sl->select_limit)
|
if (select_limit_cnt < sl->select_limit)
|
||||||
select_limit_cnt= HA_POS_ERROR; // no limit
|
select_limit_cnt= HA_POS_ERROR; // no limit
|
||||||
|
|
||||||
/*
|
/*
|
||||||
When using braces, SQL_CALC_FOUND_ROWS affects the whole query.
|
When using braces, SQL_CALC_FOUND_ROWS affects the whole query:
|
||||||
We don't calculate found_rows() per union part
|
we don't calculate found_rows() per union part.
|
||||||
*/
|
Otherwise, SQL_CALC_FOUND_ROWS should be done on all sub parts.
|
||||||
if (select_limit_cnt == HA_POS_ERROR || sl->braces)
|
*/
|
||||||
sl->options&= ~OPTION_FOUND_ROWS;
|
sl->join->select_options=
|
||||||
else
|
(select_limit_cnt == HA_POS_ERROR || sl->braces) ?
|
||||||
{
|
sl->options & ~OPTION_FOUND_ROWS : sl->options | found_rows_for_union;
|
||||||
/*
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
sl->join->select_options=sl->options;
|
|
||||||
res= sl->join->optimize();
|
res= sl->join->optimize();
|
||||||
}
|
}
|
||||||
if (!res)
|
if (!res)
|
||||||
@ -498,7 +488,8 @@ bool st_select_lex_unit::exec()
|
|||||||
}
|
}
|
||||||
/* Needed for the following test and for records_at_start in next loop */
|
/* Needed for the following test and for records_at_start in next loop */
|
||||||
table->file->info(HA_STATUS_VARIABLE);
|
table->file->info(HA_STATUS_VARIABLE);
|
||||||
if (found_rows_for_union & sl->options)
|
if (found_rows_for_union && !sl->braces &&
|
||||||
|
select_limit_cnt != HA_POS_ERROR)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
This is a union without braces. Remember the number of rows that
|
This is a union without braces. Remember the number of rows that
|
||||||
|
Loading…
x
Reference in New Issue
Block a user