diff options
author | unknown <konstantin@mysql.com> | 2004-10-22 23:06:24 +0400 |
---|---|---|
committer | unknown <konstantin@mysql.com> | 2004-10-22 23:06:24 +0400 |
commit | 7275d29eb98e2090fb4f667c591aafdc144377af (patch) | |
tree | dbf404c0a3c33aebc9b22c93972862dfc7e949a5 | |
parent | cac908520cc3a261c05bd699488ef832f8a76565 (diff) | |
parent | 0798c99db1be457d718155b6ea0e5e52a2651087 (diff) | |
download | mariadb-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.result | 38 | ||||
-rw-r--r-- | mysql-test/r/subselect.result | 6 | ||||
-rw-r--r-- | mysql-test/t/ps.test | 28 | ||||
-rw-r--r-- | sql/sql_union.cc | 28 |
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; |