summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <konstantin@mysql.com>2004-10-22 23:06:24 +0400
committerunknown <konstantin@mysql.com>2004-10-22 23:06:24 +0400
commit7275d29eb98e2090fb4f667c591aafdc144377af (patch)
treedbf404c0a3c33aebc9b22c93972862dfc7e949a5
parentcac908520cc3a261c05bd699488ef832f8a76565 (diff)
parent0798c99db1be457d718155b6ea0e5e52a2651087 (diff)
downloadmariadb-git-7275d29eb98e2090fb4f667c591aafdc144377af.tar.gz
Merge bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/media/sda1/mysql/mysql-4.1-6088
-rw-r--r--mysql-test/r/ps.result38
-rw-r--r--mysql-test/r/subselect.result6
-rw-r--r--mysql-test/t/ps.test28
-rw-r--r--sql/sql_union.cc28
4 files changed, 70 insertions, 30 deletions
diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result
index a416ba5c482..e1391a496c6 100644
--- a/mysql-test/r/ps.result
+++ b/mysql-test/r/ps.result
@@ -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;
diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result
index 8bcf7f9bff2..04c5f685f58 100644
--- a/mysql-test/r/subselect.result
+++ b/mysql-test/r/subselect.result
@@ -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
diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test
index 9546a698e58..76da86dc6df 100644
--- a/mysql-test/t/ps.test
+++ b/mysql-test/t/ps.test
@@ -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;
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index 44004e1238d..f9a1908355b 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -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,
@@ -217,14 +216,17 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
select_limit_cnt= HA_POS_ERROR; // no limit
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) +
- sl->group_list.elements,
- (sl->braces) ?
- (ORDER *)sl->order_list.first : (ORDER *) 0,
+ (can_skip_order_by ? 0 : sl->order_list.elements) +
+ sl->group_list.elements,
+ 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;