Commit 7275d29e authored by unknown's avatar unknown
Browse files

Merge bk-internal.mysql.com:/home/bk/mysql-4.1

into mysql.com:/media/sda1/mysql/mysql-4.1-6088

parents cac90852 0798c99d
Loading
Loading
Loading
Loading
+32 −6
Original line number Diff line number Diff line
@@ -413,14 +413,40 @@ deallocate prepare stmt;
create table t1 (a int);
insert into t1 values (1),(2),(3);
create table t2 select * from t1;
PREPARE my_stmt FROM 'create table t2 select * from t1';
prepare stmt FROM 'create table t2 select * from t1';
drop table t2;
execute my_stmt;
execute stmt;
drop table t2;
execute my_stmt;
execute my_stmt;
execute stmt;
execute stmt;
ERROR 42S01: Table 't2' already exists
drop table t2;
execute my_stmt;
execute stmt;
drop table t1,t2;
deallocate prepare my_stmt;
deallocate prepare stmt;
create table t1 (a int);
insert into t1 (a) values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
prepare stmt from "select sql_calc_found_rows * from t1 limit 2";
execute stmt;
a
1
2
select found_rows();
found_rows()
10
execute stmt;
a
1
2
select found_rows();
found_rows()
10
execute stmt;
a
1
2
select found_rows();
found_rows()
10
deallocate prepare stmt;
drop table t1;
+3 −3
Original line number Diff line number Diff line
@@ -176,17 +176,17 @@ a b
a	b
1	7
2	7
3	8
4	8
3	8
explain extended (select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1)) union (select * from t4 where t4.b=(select max(t2.a)*4 from t2) order by a);
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	2	Using where
2	SUBQUERY	t3	ALL	NULL	NULL	NULL	NULL	3	Using filesort
3	UNION	t4	ALL	NULL	NULL	NULL	NULL	3	Using where; Using filesort
3	UNION	t4	ALL	NULL	NULL	NULL	NULL	3	Using where
4	SUBQUERY	t2	ALL	NULL	NULL	NULL	NULL	2	
NULL	UNION RESULT	<union1,3>	ALL	NULL	NULL	NULL	NULL	NULL	
Warnings:
Note	1003	(select test.t2.a AS `a`,test.t2.b AS `b` from test.t2 where (test.t2.b = (select test.t3.a AS `a` from test.t3 order by test.t3.a desc limit 1))) union (select test.t4.a AS `a`,test.t4.b AS `b` from test.t4 where (test.t4.b = (select (max(test.t2.a) * 4) AS `max(t2.a)*4` from test.t2)) order by test.t4.a)
Note	1003	(select test.t2.a AS `a`,test.t2.b AS `b` from test.t2 where (test.t2.b = (select test.t3.a AS `a` from test.t3 order by test.t3.a desc limit 1))) union (select test.t4.a AS `a`,test.t4.b AS `b` from test.t4 where (test.t4.b = (select (max(test.t2.a) * 4) AS `max(t2.a)*4` from test.t2)) order by a)
select (select a from t3 where a<t2.a*4 order by 1 desc limit 1), a from t2;
(select a from t3 where a<t2.a*4 order by 1 desc limit 1)	a
3	1
+22 −6
Original line number Diff line number Diff line
@@ -422,14 +422,30 @@ deallocate prepare stmt;
create table t1 (a int); 
insert into t1 values (1),(2),(3);
create table t2 select * from t1;
PREPARE my_stmt FROM 'create table t2 select * from t1';
prepare stmt FROM 'create table t2 select * from t1';
drop table t2;
execute my_stmt;
execute stmt;
drop table t2;
execute my_stmt;
execute stmt;
--error 1050
execute my_stmt;
execute stmt;
drop table t2;
execute my_stmt;
execute stmt;
drop table t1,t2;
deallocate prepare my_stmt;
deallocate prepare stmt;

#
# Bug#6088 "FOUND_ROWS returns wrong values for prepared statements when
# LIMIT is used"
# 
create table t1 (a int);
insert into t1 (a) values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
prepare stmt from "select sql_calc_found_rows * from t1 limit 2";
execute stmt;
select found_rows();
execute stmt;
select found_rows();
execute stmt;
select found_rows();
deallocate prepare stmt;
drop table t1;
+13 −15
Original line number Diff line number Diff line
@@ -147,6 +147,7 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
  SELECT_LEX *lex_select_save= thd_arg->lex->current_select;
  SELECT_LEX *sl, *first_select;
  select_result *tmp_result;
  bool is_union;
  DBUG_ENTER("st_select_lex_unit::prepare");

  describe= test(additional_options & SELECT_DESCRIBE);
@@ -183,10 +184,11 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
  
  thd_arg->lex->current_select= sl= first_select= first_select_in_union();
  found_rows_for_union= first_select->options & OPTION_FOUND_ROWS;
  is_union= test(first_select->next_select());

  /* Global option */

  if (first_select->next_select())
  if (is_union)
  {
    if (!(tmp_result= union_result= new select_union(0)))
      goto err;
@@ -195,14 +197,11 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
      tmp_result= sel_result;
  }
  else
  {
    tmp_result= sel_result;
    // single select should be processed like select in p[arantses
    first_select->braces= 1;
  }

  for (;sl; sl= sl->next_select())
  {
    bool can_skip_order_by;
    sl->options|=  SELECT_NO_UNLOCK;
    JOIN *join= new JOIN(thd_arg, sl->item_list, 
			 sl->options | thd_arg->options | additional_options,
@@ -218,13 +217,16 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
    if (select_limit_cnt == HA_POS_ERROR || sl->braces)
      sl->options&= ~OPTION_FOUND_ROWS;

    can_skip_order_by= is_union &&
                       (!sl->braces || select_limit_cnt == HA_POS_ERROR);

    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) +
                       (can_skip_order_by ? 0 : sl->order_list.elements) +
                       sl->group_list.elements,
		       (sl->braces) ? 
		       (ORDER *)sl->order_list.first : (ORDER *) 0,
                       can_skip_order_by ?
                       (ORDER*) 0 : (ORDER *)sl->order_list.first,
		       (ORDER*) sl->group_list.first,
		       sl->having,
		       (ORDER*) NULL,
@@ -264,10 +266,8 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
    }
  }

  if (first_select->next_select())
  if (is_union)
  {
    /* This is not a single select */

    /*
      Check that it was possible to aggregate
      all collations together for UNION.
@@ -364,8 +364,6 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
      }
    }
  }
  else
    first_select->braces= 0; // remove our changes

  thd_arg->lex->current_select= lex_select_save;