Commit 10349b11 authored by unknown's avatar unknown

Manual merge


mysql-test/r/connect.result:
  Auto merged
mysql-test/t/connect.test:
  Auto merged
ndb/src/mgmsrv/MgmtSrvr.cpp:
  Auto merged
sql/sql_select.cc:
  Auto merged
parents 5ae2ca21 17ec83fc
drop table if exists t1,t2;
show tables; show tables;
Tables_in_mysql Tables_in_mysql
columns_priv columns_priv
...@@ -71,3 +72,8 @@ show tables; ...@@ -71,3 +72,8 @@ show tables;
Tables_in_test Tables_in_test
delete from mysql.user where user=_binary"test"; delete from mysql.user where user=_binary"test";
flush privileges; flush privileges;
create table t1 (id integer not null auto_increment primary key);
create temporary table t2(id integer not null auto_increment primary key);
set @id := 1;
delete from t1 where id like @id;
drop table t1;
...@@ -555,6 +555,31 @@ IFNULL(a, 'TEST') COALESCE(b, 'TEST') ...@@ -555,6 +555,31 @@ IFNULL(a, 'TEST') COALESCE(b, 'TEST')
4 TEST 4 TEST
TEST TEST TEST TEST
DROP TABLE t1,t2; DROP TABLE t1,t2;
CREATE TABLE t1 (a INT(10) NOT NULL, b INT(10) NOT NULL);
INSERT INTO t1 VALUES (1, 1);
INSERT INTO t1 VALUES (1, 2);
SELECT a, b, a AS c, COUNT(*) AS count FROM t1 GROUP BY a, b, c WITH ROLLUP;
a b c count
1 1 1 1
1 1 NULL 1
1 2 1 1
1 2 NULL 1
1 NULL NULL 2
NULL NULL NULL 2
DROP TABLE t1;
CREATE TABLE t1 (a int(11) NOT NULL);
INSERT INTO t1 VALUES (1),(2);
SELECT * FROM (SELECT a, a + 1, COUNT(*) FROM t1 GROUP BY a WITH ROLLUP) t;
a a + 1 COUNT(*)
1 2 1
2 3 1
NULL NULL 2
SELECT * FROM (SELECT a, LENGTH(a), COUNT(*) FROM t1 GROUP BY a WITH ROLLUP) t;
a LENGTH(a) COUNT(*)
1 1 1
2 1 1
NULL NULL 2
DROP TABLE t1;
CREATE TABLE t1(id int, type char(1)); CREATE TABLE t1(id int, type char(1));
INSERT INTO t1 VALUES INSERT INTO t1 VALUES
(1,"A"),(2,"C"),(3,"A"),(4,"A"),(5,"B"), (1,"A"),(2,"C"),(3,"A"),(4,"A"),(5,"B"),
...@@ -577,15 +602,3 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -577,15 +602,3 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 10 Using filesort 1 PRIMARY t1 ALL NULL NULL NULL NULL 10 Using filesort
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a INT(10) NOT NULL, b INT(10) NOT NULL);
INSERT INTO t1 VALUES (1, 1);
INSERT INTO t1 VALUES (1, 2);
SELECT a, b, a AS c, COUNT(*) AS count FROM t1 GROUP BY a, b, c WITH ROLLUP;
a b c count
1 1 1 1
1 1 NULL 1
1 2 1 1
1 2 NULL 1
1 NULL NULL 2
NULL NULL NULL 2
DROP TABLE t1;
...@@ -6,6 +6,10 @@ ...@@ -6,6 +6,10 @@
# This test makes no sense with the embedded server # This test makes no sense with the embedded server
--source include/not_embedded.inc --source include/not_embedded.inc
--disable_warnings
drop table if exists t1,t2;
--enable_warnings
#connect (con1,localhost,root,,""); #connect (con1,localhost,root,,"");
#show tables; #show tables;
connect (con1,localhost,root,,mysql); connect (con1,localhost,root,,mysql);
...@@ -77,4 +81,18 @@ show tables; ...@@ -77,4 +81,18 @@ show tables;
delete from mysql.user where user=_binary"test"; delete from mysql.user where user=_binary"test";
flush privileges; flush privileges;
#
# Bug#12517: Clear user variables and replication events before
# closing temp tables in thread cleanup.
connect (con2,localhost,root,,test);
connection con2;
create table t1 (id integer not null auto_increment primary key);
create temporary table t2(id integer not null auto_increment primary key);
set @id := 1;
delete from t1 where id like @id;
disconnect con2;
--sleep 5
connection default;
drop table t1;
# End of 4.1 tests # End of 4.1 tests
...@@ -2,10 +2,6 @@ ...@@ -2,10 +2,6 @@
drop table if exists t1,t2; drop table if exists t1,t2;
--enable_warnings --enable_warnings
set @sav_dpi= @@div_precision_increment;
set div_precision_increment= 5;
show variables like 'div_precision_increment';
create table t1 (product varchar(32), country_id int not null, year int, profit int); create table t1 (product varchar(32), country_id int not null, year int, profit int);
insert into t1 values ( 'Computer', 2,2000, 1200), insert into t1 values ( 'Computer', 2,2000, 1200),
( 'TV', 1, 1999, 150), ( 'TV', 1, 1999, 150),
...@@ -157,13 +153,6 @@ SELECT DISTINCT SUM(b), COUNT(DISTINCT b), COUNT(*) FROM t1 ...@@ -157,13 +153,6 @@ SELECT DISTINCT SUM(b), COUNT(DISTINCT b), COUNT(*) FROM t1
SELECT a, sum(b) FROM t1 GROUP BY a,b WITH ROLLUP; SELECT a, sum(b) FROM t1 GROUP BY a,b WITH ROLLUP;
SELECT DISTINCT a, sum(b) FROM t1 GROUP BY a,b WITH ROLLUP; SELECT DISTINCT a, sum(b) FROM t1 GROUP BY a,b WITH ROLLUP;
SELECT b, a, sum(b) FROM t1 GROUP BY a,b WITH ROLLUP;
SELECT DISTINCT b,a, sum(b) FROM t1 GROUP BY a,b WITH ROLLUP;
ALTER TABLE t1 ADD COLUMN c INT;
SELECT a,b,sum(c) FROM t1 GROUP BY a,b,c WITH ROLLUP;
SELECT distinct a,b,sum(c) FROM t1 GROUP BY a,b,c WITH ROLLUP;
DROP TABLE t1; DROP TABLE t1;
# #
...@@ -195,7 +184,6 @@ SELECT a, SUM(a) m FROM t1 GROUP BY a WITH ROLLUP; ...@@ -195,7 +184,6 @@ SELECT a, SUM(a) m FROM t1 GROUP BY a WITH ROLLUP;
SELECT * FROM ( SELECT a, SUM(a) m FROM t1 GROUP BY a WITH ROLLUP ) t2; SELECT * FROM ( SELECT a, SUM(a) m FROM t1 GROUP BY a WITH ROLLUP ) t2;
DROP TABLE t1; DROP TABLE t1;
set div_precision_increment= @sav_dpi;
# #
# Tests for bug #7914: ROLLUP over expressions on temporary table # Tests for bug #7914: ROLLUP over expressions on temporary table
...@@ -251,21 +239,6 @@ SELECT IFNULL(a, 'TEST'), COALESCE(b, 'TEST') FROM t2 ...@@ -251,21 +239,6 @@ SELECT IFNULL(a, 'TEST'), COALESCE(b, 'TEST') FROM t2
DROP TABLE t1,t2; DROP TABLE t1,t2;
# #
# Tests for bug #11639: ROLLUP over view executed through filesort
#
CREATE TABLE t1(id int, type char(1));
INSERT INTO t1 VALUES
(1,"A"),(2,"C"),(3,"A"),(4,"A"),(5,"B"),
(6,"B"),(7,"A"),(8,"C"),(9,"A"),(10,"C");
CREATE VIEW v1 AS SELECT * FROM t1;
SELECT type FROM t1 GROUP BY type WITH ROLLUP;
SELECT type FROM v1 GROUP BY type WITH ROLLUP;
EXPLAIN SELECT type FROM v1 GROUP BY type WITH ROLLUP;
DROP VIEW v1;
DROP TABLE t1;
# Test for bug #11543: ROLLUP query with a repeated column in GROUP BY # Test for bug #11543: ROLLUP query with a repeated column in GROUP BY
# #
...@@ -277,4 +250,17 @@ SELECT a, b, a AS c, COUNT(*) AS count FROM t1 GROUP BY a, b, c WITH ROLLUP; ...@@ -277,4 +250,17 @@ SELECT a, b, a AS c, COUNT(*) AS count FROM t1 GROUP BY a, b, c WITH ROLLUP;
DROP TABLE t1; DROP TABLE t1;
#
# Bug #11885: derived table specified by a subquery with
# ROLLUP over expressions on not nullable group by attributes
#
CREATE TABLE t1 (a int(11) NOT NULL);
INSERT INTO t1 VALUES (1),(2);
SELECT * FROM (SELECT a, a + 1, COUNT(*) FROM t1 GROUP BY a WITH ROLLUP) t;
SELECT * FROM (SELECT a, LENGTH(a), COUNT(*) FROM t1 GROUP BY a WITH ROLLUP) t;
DROP TABLE t1;
# End of 4.1 tests # End of 4.1 tests
...@@ -266,5 +266,5 @@ SignalSender::execNodeStatus(void* signalSender, ...@@ -266,5 +266,5 @@ SignalSender::execNodeStatus(void* signalSender,
template SimpleSignal* SignalSender::waitFor<WaitForNode>(unsigned, WaitForNode&); template SimpleSignal* SignalSender::waitFor<WaitForNode>(unsigned, WaitForNode&);
template SimpleSignal* SignalSender::waitFor<WaitForAny>(unsigned, WaitForAny&); template SimpleSignal* SignalSender::waitFor<WaitForAny>(unsigned, WaitForAny&);
template Vector<SimpleSignal*>; template class Vector<SimpleSignal*>;
...@@ -377,6 +377,8 @@ void THD::cleanup(void) ...@@ -377,6 +377,8 @@ void THD::cleanup(void)
mysql_ha_flush(this, (TABLE_LIST*) 0, mysql_ha_flush(this, (TABLE_LIST*) 0,
MYSQL_HA_CLOSE_FINAL | MYSQL_HA_FLUSH_ALL); MYSQL_HA_CLOSE_FINAL | MYSQL_HA_FLUSH_ALL);
hash_free(&handler_tables_hash); hash_free(&handler_tables_hash);
delete_dynamic(&user_var_events);
hash_free(&user_vars);
close_temporary_tables(this); close_temporary_tables(this);
my_free((char*) variables.time_format, MYF(MY_ALLOW_ZERO_PTR)); my_free((char*) variables.time_format, MYF(MY_ALLOW_ZERO_PTR));
my_free((char*) variables.date_format, MYF(MY_ALLOW_ZERO_PTR)); my_free((char*) variables.date_format, MYF(MY_ALLOW_ZERO_PTR));
......
...@@ -13043,6 +13043,8 @@ void free_underlaid_joins(THD *thd, SELECT_LEX *select) ...@@ -13043,6 +13043,8 @@ void free_underlaid_joins(THD *thd, SELECT_LEX *select)
The function replaces occurrences of group by fields in expr The function replaces occurrences of group by fields in expr
by ref objects for these fields unless they are under aggregate by ref objects for these fields unless they are under aggregate
functions. functions.
The function also corrects value of the the maybe_null attribute
for the items of all subexpressions containing group by fields.
IMPLEMENTATION IMPLEMENTATION
The function recursively traverses the tree of the expr expression, The function recursively traverses the tree of the expr expression,
...@@ -13053,6 +13055,9 @@ void free_underlaid_joins(THD *thd, SELECT_LEX *select) ...@@ -13053,6 +13055,9 @@ void free_underlaid_joins(THD *thd, SELECT_LEX *select)
This substitution is needed GROUP BY queries with ROLLUP if This substitution is needed GROUP BY queries with ROLLUP if
SELECT list contains expressions over group by attributes. SELECT list contains expressions over group by attributes.
TODO: Some functions are not null-preserving. For those functions
updating of the maybe_null attribute is an overkill.
EXAMPLES EXAMPLES
SELECT a+1 FROM t1 GROUP BY a WITH ROLLUP SELECT a+1 FROM t1 GROUP BY a WITH ROLLUP
SELECT SUM(a)+a FROM t1 GROUP BY a WITH ROLLUP SELECT SUM(a)+a FROM t1 GROUP BY a WITH ROLLUP
...@@ -13074,6 +13079,7 @@ static bool change_group_ref(THD *thd, Item_func *expr, ORDER *group_list, ...@@ -13074,6 +13079,7 @@ static bool change_group_ref(THD *thd, Item_func *expr, ORDER *group_list,
arg != arg_end; arg++) arg != arg_end; arg++)
{ {
Item *item= *arg; Item *item= *arg;
bool arg_changed= FALSE;
if (item->type() == Item::FIELD_ITEM || item->type() == Item::REF_ITEM) if (item->type() == Item::FIELD_ITEM || item->type() == Item::REF_ITEM)
{ {
ORDER *group_tmp; ORDER *group_tmp;
...@@ -13086,15 +13092,20 @@ static bool change_group_ref(THD *thd, Item_func *expr, ORDER *group_list, ...@@ -13086,15 +13092,20 @@ static bool change_group_ref(THD *thd, Item_func *expr, ORDER *group_list,
item->name))) item->name)))
return 1; // fatal_error is set return 1; // fatal_error is set
thd->change_item_tree(arg, new_item); thd->change_item_tree(arg, new_item);
*changed= TRUE; arg_changed= TRUE;
} }
} }
} }
else if (item->type() == Item::FUNC_ITEM) else if (item->type() == Item::FUNC_ITEM)
{ {
if (change_group_ref(thd, (Item_func *) item, group_list, changed)) if (change_group_ref(thd, (Item_func *) item, group_list, &arg_changed))
return 1; return 1;
} }
if (arg_changed)
{
expr->maybe_null= 1;
*changed= TRUE;
}
} }
} }
return 0; return 0;
...@@ -13157,7 +13168,7 @@ bool JOIN::rollup_init() ...@@ -13157,7 +13168,7 @@ bool JOIN::rollup_init()
} }
if (item->type() == Item::FUNC_ITEM) if (item->type() == Item::FUNC_ITEM)
{ {
bool changed= 0; bool changed= FALSE;
if (change_group_ref(thd, (Item_func *) item, group_list, &changed)) if (change_group_ref(thd, (Item_func *) item, group_list, &changed))
return 1; return 1;
/* /*
......
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