summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Kopytov <Alexey.Kopytov@Sun.com>2009-11-06 17:56:51 +0300
committerAlexey Kopytov <Alexey.Kopytov@Sun.com>2009-11-06 17:56:51 +0300
commit58ee6c80ebd59fcb54ba61a196f7ae5e25e6b928 (patch)
treedeebaa6d3b8c53f993b541d23de94fc1a893f385
parent43358bccd1227d8b7a28c64b1e2e262ab8f643d2 (diff)
parent39f9a3ffd0de8828be2a43b9674a19fa58c52f98 (diff)
downloadmariadb-git-58ee6c80ebd59fcb54ba61a196f7ae5e25e6b928.tar.gz
Automerge.
-rw-r--r--mysql-test/r/olap.result12
-rw-r--r--mysql-test/t/olap.test13
-rw-r--r--sql/sql_select.cc23
3 files changed, 41 insertions, 7 deletions
diff --git a/mysql-test/r/olap.result b/mysql-test/r/olap.result
index 56e06f03378..eabe3a50309 100644
--- a/mysql-test/r/olap.result
+++ b/mysql-test/r/olap.result
@@ -753,4 +753,16 @@ b
100
NULL
DROP TABLE t1, t2;
+#
+# Bug #48475: DISTINCT is ignored with GROUP BY WITH ROLLUP
+# and only const tables
+CREATE TABLE t1 (a INT);
+CREATE TABLE t2 (b INT);
+INSERT INTO t1 VALUES (1);
+INSERT INTO t2 VALUES (1);
+SELECT DISTINCT b FROM t1, t2 GROUP BY a, b WITH ROLLUP;
+b
+1
+NULL
+DROP TABLE t1, t2;
End of 5.0 tests
diff --git a/mysql-test/t/olap.test b/mysql-test/t/olap.test
index 8f672af40a3..fec5df1a1c7 100644
--- a/mysql-test/t/olap.test
+++ b/mysql-test/t/olap.test
@@ -390,4 +390,17 @@ SELECT DISTINCT b FROM t1, t2 GROUP BY a, b WITH ROLLUP;
DROP TABLE t1, t2;
+--echo #
+--echo # Bug #48475: DISTINCT is ignored with GROUP BY WITH ROLLUP
+--echo # and only const tables
+
+CREATE TABLE t1 (a INT);
+CREATE TABLE t2 (b INT);
+INSERT INTO t1 VALUES (1);
+INSERT INTO t2 VALUES (1);
+
+SELECT DISTINCT b FROM t1, t2 GROUP BY a, b WITH ROLLUP;
+
+DROP TABLE t1, t2;
+
--echo End of 5.0 tests
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 51794c1f158..1ee31c788ff 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -929,14 +929,20 @@ JOIN::optimize()
DBUG_RETURN(1);
}
- if (select_lex->olap == ROLLUP_TYPE && rollup_process_const_fields())
+ if (rollup.state != ROLLUP::STATE_NONE)
{
- DBUG_PRINT("error", ("Error: rollup_process_fields() failed"));
- DBUG_RETURN(1);
+ if (rollup_process_const_fields())
+ {
+ DBUG_PRINT("error", ("Error: rollup_process_fields() failed"));
+ DBUG_RETURN(1);
+ }
+ }
+ else
+ {
+ /* Remove distinct if only const tables */
+ select_distinct= select_distinct && (const_tables != tables);
}
- /* Remove distinct if only const tables */
- select_distinct= select_distinct && (const_tables != tables);
thd_proc_info(thd, "preparing");
if (result->initialize_tables(this))
{
@@ -1216,11 +1222,14 @@ JOIN::optimize()
- We are using an ORDER BY or GROUP BY on fields not in the first table
- We are using different ORDER BY and GROUP BY orders
- The user wants us to buffer the result.
+ When the WITH ROLLUP modifier is present, we cannot skip temporary table
+ creation for the DISTINCT clause just because there are only const tables.
*/
- need_tmp= (const_tables != tables &&
+ need_tmp= ((const_tables != tables &&
((select_distinct || !simple_order || !simple_group) ||
(group_list && order) ||
- test(select_options & OPTION_BUFFER_RESULT)));
+ test(select_options & OPTION_BUFFER_RESULT))) ||
+ rollup.state != ROLLUP::STATE_NONE && select_distinct);
// No cache for MATCH
make_join_readinfo(this,