Commit 710a3262 authored by ramil@mysql.com's avatar ramil@mysql.com

Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-5.0

into mysql.com:/usr/home/ram/work/5.0
parents f170e8e0 e9a20acb
...@@ -487,3 +487,15 @@ insert into t1 values ('foo'); ...@@ -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'); ...@@ -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;
...@@ -1837,8 +1837,6 @@ void st_select_lex_unit::set_limit(SELECT_LEX *values, ...@@ -1837,8 +1837,6 @@ void st_select_lex_unit::set_limit(SELECT_LEX *values,
select_limit_cnt= values->select_limit+values->offset_limit; select_limit_cnt= values->select_limit+values->offset_limit;
if (select_limit_cnt < values->select_limit) if (select_limit_cnt < values->select_limit)
select_limit_cnt= HA_POS_ERROR; // no limit select_limit_cnt= HA_POS_ERROR; // no limit
if (select_limit_cnt == HA_POS_ERROR)
sl->options&= ~OPTION_FOUND_ROWS;
} }
......
...@@ -217,8 +217,6 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, ...@@ -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, ...@@ -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() ...@@ -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() ...@@ -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
......
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