1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

Merge 10.2 into 10.3

This commit is contained in:
Marko Mäkelä
2021-09-29 15:04:20 +03:00
15 changed files with 365 additions and 255 deletions

View File

@ -6777,6 +6777,49 @@ sum(z)
DROP TABLE t1; DROP TABLE t1;
DROP VIEW v1; DROP VIEW v1;
# #
# MDEV-24454: Crash at change_item_tree
#
CREATE TABLE t1(f0 INT);
CREATE VIEW v1 AS
SELECT
f0 AS f1
FROM t1;
CREATE VIEW v2 AS
SELECT
(SELECT GROUP_CONCAT(v1.f1 SEPARATOR ', ')
FROM v1 n) AS f2,
GROUP_CONCAT('' SEPARATOR ', ') AS f3
FROM v1;
CREATE VIEW v3 AS
SELECT 1 as f4 FROM v2;
CREATE PROCEDURE p1()
SELECT * FROM v3;
CALL p1();
f4
1
CALL p1();
f4
1
drop procedure p1;
drop view v1,v2,v3;
drop table t1;
#
# MDEV-25631: Crash in st_select_lex::mark_as_dependent with
# VIEW, aggregate and subquery
#
CREATE TABLE t1 (i1 int);
insert into t1 values (1),(2),(3);
CREATE VIEW v1 AS
SELECT t1.i1 FROM (t1 a JOIN t1 ON (t1.i1 = (SELECT t1.i1 FROM t1 b)));
SELECT 1 FROM (SELECT count(((SELECT i1 FROM v1))) FROM v1) dt ;
ERROR 21000: Subquery returns more than 1 row
delete from t1 where i1 > 1;
SELECT 1 FROM (SELECT count(((SELECT i1 FROM v1))) FROM v1) dt ;
1
1
drop view v1;
drop table t1;
#
# End of 10.2 tests # End of 10.2 tests
# #
# #

View File

@ -6499,6 +6499,55 @@ SELECT sum(z) FROM v1;
DROP TABLE t1; DROP TABLE t1;
DROP VIEW v1; DROP VIEW v1;
--echo #
--echo # MDEV-24454: Crash at change_item_tree
--echo #
CREATE TABLE t1(f0 INT);
CREATE VIEW v1 AS
SELECT
f0 AS f1
FROM t1;
CREATE VIEW v2 AS
SELECT
(SELECT GROUP_CONCAT(v1.f1 SEPARATOR ', ')
FROM v1 n) AS f2,
GROUP_CONCAT('' SEPARATOR ', ') AS f3
FROM v1;
CREATE VIEW v3 AS
SELECT 1 as f4 FROM v2;
CREATE PROCEDURE p1()
SELECT * FROM v3;
CALL p1();
CALL p1();
drop procedure p1;
drop view v1,v2,v3;
drop table t1;
--echo #
--echo # MDEV-25631: Crash in st_select_lex::mark_as_dependent with
--echo # VIEW, aggregate and subquery
--echo #
CREATE TABLE t1 (i1 int);
insert into t1 values (1),(2),(3); #not important
CREATE VIEW v1 AS
SELECT t1.i1 FROM (t1 a JOIN t1 ON (t1.i1 = (SELECT t1.i1 FROM t1 b)));
--error ER_SUBQUERY_NO_1_ROW
SELECT 1 FROM (SELECT count(((SELECT i1 FROM v1))) FROM v1) dt ;
delete from t1 where i1 > 1;
SELECT 1 FROM (SELECT count(((SELECT i1 FROM v1))) FROM v1) dt ;
drop view v1;
drop table t1;
--echo # --echo #
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #

View File

@ -34,31 +34,3 @@ COUNT(f1) = 1000
1 1
DROP TABLE t1; DROP TABLE t1;
DROP TABLE ten; DROP TABLE ten;
connection node_1;
SET @value=REPEAT (1,5001);
CREATE TABLE t (a VARCHAR(5000),FULLTEXT (a)) engine=innodb DEFAULT CHARSET=utf8;
INSERT IGNORE INTO t VALUES(@value);
Warnings:
Warning 1265 Data truncated for column 'a' at row 1
SELECT COUNT(*) FROM t;
COUNT(*)
1
connection node_2;
SELECT COUNT(*) FROM t;
COUNT(*)
1
connection node_1;
DROP TABLE t;
CREATE TABLE t (a VARCHAR(5000)) engine=innodb DEFAULT CHARSET=utf8;
INSERT IGNORE INTO t VALUES(@value);
Warnings:
Warning 1265 Data truncated for column 'a' at row 1
SELECT COUNT(*) FROM t;
COUNT(*)
1
connection node_2;
SELECT COUNT(*) FROM t;
COUNT(*)
1
connection node_1;
DROP TABLE t;

View File

@ -1,6 +1,4 @@
--source include/big_test.inc
--source include/galera_cluster.inc --source include/galera_cluster.inc
--source include/have_innodb.inc
# #
# InnoDB FULLTEXT indexes # InnoDB FULLTEXT indexes
@ -63,24 +61,25 @@ DROP TABLE ten;
# #
# Case 2: UTF-8 # Case 2: UTF-8
# TODO: MDEV-24978
# #
--connection node_1 #--connection node_1
SET @value=REPEAT (1,5001); #SET @value=REPEAT (1,5001);
CREATE TABLE t (a VARCHAR(5000),FULLTEXT (a)) engine=innodb DEFAULT CHARSET=utf8; #CREATE TABLE t (a VARCHAR(5000),FULLTEXT (a)) engine=innodb DEFAULT CHARSET=utf8;
INSERT IGNORE INTO t VALUES(@value); #INSERT IGNORE INTO t VALUES(@value);
SELECT COUNT(*) FROM t; #SELECT COUNT(*) FROM t;
#
--connection node_2 #--connection node_2
SELECT COUNT(*) FROM t; #SELECT COUNT(*) FROM t;
#
--connection node_1 #--connection node_1
DROP TABLE t; #DROP TABLE t;
CREATE TABLE t (a VARCHAR(5000)) engine=innodb DEFAULT CHARSET=utf8; #CREATE TABLE t (a VARCHAR(5000)) engine=innodb DEFAULT CHARSET=utf8;
INSERT IGNORE INTO t VALUES(@value); #INSERT IGNORE INTO t VALUES(@value);
SELECT COUNT(*) FROM t; #SELECT COUNT(*) FROM t;
#
--connection node_2 #--connection node_2
SELECT COUNT(*) FROM t; #SELECT COUNT(*) FROM t;
#
--connection node_1 #--connection node_1
DROP TABLE t; #DROP TABLE t;

View File

@ -1,123 +1,118 @@
SET GLOBAL innodb_defragment_stats_accuracy = 20; SET GLOBAL innodb_defragment_stats_accuracy = 20;
DELETE FROM mysql.innodb_index_stats; DELETE FROM mysql.innodb_index_stats;
# Create table. # Create table.
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b VARCHAR(256), KEY SECOND(a, b)) ENGINE=INNODB; CREATE TABLE t1 (a INT PRIMARY KEY AUTO_INCREMENT, b VARCHAR(256),
INSERT INTO t1 SELECT seq, REPEAT('A', 256) FROM seq_1_to_1024; KEY SECOND(a, b)) ENGINE=INNODB STATS_PERSISTENT=0;
INSERT INTO t1 SELECT 100*FLOOR(seq/70)+seq%70, REPEAT('A', 256)
FROM seq_1_to_1024;
# Not enough page splits to trigger persistent stats write yet. # Not enough page splits to trigger persistent stats write yet.
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split'); SELECT * FROM mysql.innodb_index_stats;
count(stat_value) = 0 database_name table_name index_name last_update stat_name stat_value sample_size stat_description
1 INSERT INTO t1 SELECT 100*FLOOR(seq/70)+seq%70, REPEAT('A', 256)
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed'); FROM seq_1025_to_1433;
count(stat_value) = 0
1
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag');
count(stat_value) = 0
1
INSERT INTO t1 SELECT seq, REPEAT('A', 256) FROM seq_1025_to_2048;
# Persistent stats recorded.
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split');
count(stat_value) > 0
1
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed');
count(stat_value) = 0
1
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag');
count(stat_value) > 0
1
# Delete some rows.
BEGIN; BEGIN;
delete from t1 where a between 100 * 20 and 100 * 20 + 30; INSERT INTO t1 SELECT 100*20+seq, REPEAT('A', 256)
delete from t1 where a between 100 * 19 and 100 * 19 + 30; FROM seq_70_to_99;
delete from t1 where a between 100 * 18 and 100 * 18 + 30; INSERT INTO t1 SELECT 100*19+seq, REPEAT('A', 256)
delete from t1 where a between 100 * 17 and 100 * 17 + 30; FROM seq_70_to_99;
delete from t1 where a between 100 * 16 and 100 * 16 + 30; INSERT INTO t1 SELECT 100*18+seq, REPEAT('A', 256)
delete from t1 where a between 100 * 15 and 100 * 15 + 30; FROM seq_70_to_99;
delete from t1 where a between 100 * 14 and 100 * 14 + 30; INSERT INTO t1 SELECT 100*17+seq, REPEAT('A', 256)
delete from t1 where a between 100 * 13 and 100 * 13 + 30; FROM seq_70_to_99;
delete from t1 where a between 100 * 12 and 100 * 12 + 30; INSERT INTO t1 SELECT 100*16+seq, REPEAT('A', 256)
delete from t1 where a between 100 * 11 and 100 * 11 + 30; FROM seq_70_to_99;
delete from t1 where a between 100 * 10 and 100 * 10 + 30; INSERT INTO t1 SELECT 100*15+seq, REPEAT('A', 256)
delete from t1 where a between 100 * 9 and 100 * 9 + 30; FROM seq_70_to_99;
delete from t1 where a between 100 * 8 and 100 * 8 + 30; INSERT INTO t1 SELECT 100*14+seq, REPEAT('A', 256)
delete from t1 where a between 100 * 7 and 100 * 7 + 30; FROM seq_70_to_99;
delete from t1 where a between 100 * 6 and 100 * 6 + 30; INSERT INTO t1 SELECT 100*13+seq, REPEAT('A', 256)
delete from t1 where a between 100 * 5 and 100 * 5 + 30; FROM seq_70_to_99;
delete from t1 where a between 100 * 4 and 100 * 4 + 30; INSERT INTO t1 SELECT 100*12+seq, REPEAT('A', 256)
delete from t1 where a between 100 * 3 and 100 * 3 + 30; FROM seq_70_to_99;
delete from t1 where a between 100 * 2 and 100 * 2 + 30; INSERT INTO t1 SELECT 100*11+seq, REPEAT('A', 256)
delete from t1 where a between 100 * 1 and 100 * 1 + 30; FROM seq_70_to_99;
COMMIT; INSERT INTO t1 SELECT 100*10+seq, REPEAT('A', 256)
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split'); FROM seq_70_to_99;
count(stat_value) > 0 INSERT INTO t1 SELECT 100*9+seq, REPEAT('A', 256)
1 FROM seq_70_to_99;
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed'); INSERT INTO t1 SELECT 100*8+seq, REPEAT('A', 256)
count(stat_value) = 0 FROM seq_70_to_99;
1 INSERT INTO t1 SELECT 100*7+seq, REPEAT('A', 256)
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag'); FROM seq_70_to_99;
count(stat_value) > 0 INSERT INTO t1 SELECT 100*6+seq, REPEAT('A', 256)
FROM seq_70_to_99;
INSERT INTO t1 SELECT 100*5+seq, REPEAT('A', 256)
FROM seq_70_to_99;
INSERT INTO t1 SELECT 100*4+seq, REPEAT('A', 256)
FROM seq_70_to_99;
INSERT INTO t1 SELECT 100*3+seq, REPEAT('A', 256)
FROM seq_70_to_99;
INSERT INTO t1 SELECT 100*2+seq, REPEAT('A', 256)
FROM seq_70_to_99;
INSERT INTO t1 SELECT 100*1+seq, REPEAT('A', 256)
FROM seq_70_to_99;
ROLLBACK;
SELECT @@GLOBAL.innodb_force_recovery<2 "have background defragmentation";
have background defragmentation
1 1
SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
table_name index_name stat_name
t1 PRIMARY n_leaf_pages_defrag
t1 PRIMARY n_leaf_pages_reserved
t1 PRIMARY n_page_split
t1 SECOND n_leaf_pages_defrag
t1 SECOND n_leaf_pages_reserved
t1 SECOND n_page_split
optimize table t1; optimize table t1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 optimize status OK test.t1 optimize status OK
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split'); SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
count(stat_value) > 0 table_name index_name stat_name
1 t1 PRIMARY n_leaf_pages_defrag
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed'); t1 PRIMARY n_leaf_pages_reserved
count(stat_value) > 0 t1 PRIMARY n_page_split
1 t1 PRIMARY n_pages_freed
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag'); t1 SECOND n_leaf_pages_defrag
count(stat_value) > 0 t1 SECOND n_leaf_pages_reserved
1 t1 SECOND n_page_split
t1 SECOND n_pages_freed
set global innodb_defragment_stats_accuracy = 40; set global innodb_defragment_stats_accuracy = 40;
INSERT INTO t1 (b) SELECT b from t1; INSERT INTO t1 (b) SELECT b from t1;
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split'); SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
count(stat_value) > 0 table_name index_name stat_name
1 t1 PRIMARY n_leaf_pages_defrag
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed'); t1 PRIMARY n_leaf_pages_reserved
count(stat_value) > 0 t1 PRIMARY n_page_split
1 t1 PRIMARY n_pages_freed
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag'); t1 SECOND n_leaf_pages_defrag
count(stat_value) > 0 t1 SECOND n_leaf_pages_reserved
1 t1 SECOND n_page_split
t1 SECOND n_pages_freed
INSERT INTO t1 (b) SELECT b from t1; INSERT INTO t1 (b) SELECT b from t1;
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split'); SELECT stat_name FROM mysql.innodb_index_stats WHERE table_name='t1';
count(stat_value) > 0 stat_name
1 n_leaf_pages_defrag
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed'); n_leaf_pages_defrag
count(stat_value) > 0 n_leaf_pages_reserved
1 n_leaf_pages_reserved
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag'); n_page_split
count(stat_value) > 0 n_page_split
1 n_pages_freed
n_pages_freed
# Table rename should cause stats rename. # Table rename should cause stats rename.
rename table t1 to t2; rename table t1 to t2;
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split'); SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
count(stat_value) = 0 table_name index_name stat_name
1 t2 PRIMARY n_leaf_pages_defrag
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed'); t2 PRIMARY n_leaf_pages_reserved
count(stat_value) = 0 t2 PRIMARY n_page_split
1 t2 PRIMARY n_pages_freed
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag'); t2 SECOND n_leaf_pages_defrag
count(stat_value) = 0 t2 SECOND n_leaf_pages_reserved
1 t2 SECOND n_page_split
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t2%' and stat_name in ('n_page_split'); t2 SECOND n_pages_freed
count(stat_value) > 0
1
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t2%' and stat_name in ('n_pages_freed');
count(stat_value) > 0
1
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t2%' and stat_name in ('n_leaf_pages_defrag');
count(stat_value) > 0
1
# Drop index should cause stats drop, but will not. # Drop index should cause stats drop, but will not.
drop index SECOND on t2; drop index SECOND on t2;
SELECT stat_name, stat_value>0 FROM mysql.innodb_index_stats
WHERE table_name like '%t2%' AND index_name='SECOND';
stat_name stat_value>0
n_leaf_pages_defrag 1
n_leaf_pages_reserved 1
n_page_split 1
n_pages_freed 1
# #
# MDEV-26636: Statistics must not be written for temporary tables # MDEV-26636: Statistics must not be written for temporary tables
# #
@ -125,20 +120,18 @@ SET GLOBAL innodb_defragment_stats_accuracy = 1;
CREATE TEMPORARY TABLE t (a INT PRIMARY KEY, c CHAR(255) NOT NULL) CREATE TEMPORARY TABLE t (a INT PRIMARY KEY, c CHAR(255) NOT NULL)
ENGINE=InnoDB; ENGINE=InnoDB;
INSERT INTO t SELECT seq, '' FROM seq_1_to_100; INSERT INTO t SELECT seq, '' FROM seq_1_to_100;
SELECT * FROM mysql.innodb_index_stats where table_name like '%t1%'; SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
database_name table_name index_name last_update stat_name stat_value sample_size stat_description table_name index_name stat_name
SELECT table_name, index_name, stat_name, stat_value>0 t2 PRIMARY n_leaf_pages_defrag
FROM mysql.innodb_index_stats; t2 PRIMARY n_leaf_pages_reserved
table_name index_name stat_name stat_value>0 t2 PRIMARY n_page_split
t2 PRIMARY n_leaf_pages_defrag 1 t2 PRIMARY n_pages_freed
t2 PRIMARY n_leaf_pages_reserved 1 t2 SECOND n_leaf_pages_defrag
t2 PRIMARY n_page_split 1 t2 SECOND n_leaf_pages_reserved
t2 PRIMARY n_pages_freed 1 t2 SECOND n_page_split
t2 SECOND n_leaf_pages_defrag 1 t2 SECOND n_pages_freed
t2 SECOND n_leaf_pages_reserved 1
t2 SECOND n_page_split 1
t2 SECOND n_pages_freed 1
# Clean up # Clean up
ALTER TABLE t2 STATS_PERSISTENT=1;
DROP TABLE t2; DROP TABLE t2;
SELECT * FROM mysql.innodb_index_stats; SELECT * FROM mysql.innodb_index_stats;
database_name table_name index_name last_update stat_name stat_value sample_size stat_description database_name table_name index_name last_update stat_name stat_value sample_size stat_description

View File

@ -8,77 +8,65 @@ SET GLOBAL innodb_defragment_stats_accuracy = 20;
DELETE FROM mysql.innodb_index_stats; DELETE FROM mysql.innodb_index_stats;
--echo # Create table. --echo # Create table.
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b VARCHAR(256), KEY SECOND(a, b)) ENGINE=INNODB; CREATE TABLE t1 (a INT PRIMARY KEY AUTO_INCREMENT, b VARCHAR(256),
KEY SECOND(a, b)) ENGINE=INNODB STATS_PERSISTENT=0;
INSERT INTO t1 SELECT seq, REPEAT('A', 256) FROM seq_1_to_1024; INSERT INTO t1 SELECT 100*FLOOR(seq/70)+seq%70, REPEAT('A', 256)
FROM seq_1_to_1024;
--echo # Not enough page splits to trigger persistent stats write yet. --echo # Not enough page splits to trigger persistent stats write yet.
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split'); SELECT * FROM mysql.innodb_index_stats;
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed');
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag');
INSERT INTO t1 SELECT seq, REPEAT('A', 256) FROM seq_1025_to_2048; INSERT INTO t1 SELECT 100*FLOOR(seq/70)+seq%70, REPEAT('A', 256)
FROM seq_1025_to_1433;
--echo # Persistent stats recorded.
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split');
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed');
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag');
--echo # Delete some rows.
BEGIN; BEGIN;
let $num_delete = 20; let $num_delete = 20;
while ($num_delete) while ($num_delete)
{ {
let $j = 100 * $num_delete; eval INSERT INTO t1 SELECT 100*$num_delete+seq, REPEAT('A', 256)
eval delete from t1 where a between $j and $j + 30; FROM seq_70_to_99;
dec $num_delete; dec $num_delete;
} }
COMMIT; ROLLBACK;
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split'); SELECT @@GLOBAL.innodb_force_recovery<2 "have background defragmentation";
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed');
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag'); # Wait for defrag_pool to be processed.
let $wait_timeout=30;
let $wait_condition = SELECT COUNT(*)>0 FROM mysql.innodb_index_stats;
--source include/wait_condition.inc
--sorted_result
SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
optimize table t1; optimize table t1;
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split'); --sorted_result
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed'); SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag');
set global innodb_defragment_stats_accuracy = 40; set global innodb_defragment_stats_accuracy = 40;
INSERT INTO t1 (b) SELECT b from t1; INSERT INTO t1 (b) SELECT b from t1;
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split'); --sorted_result
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed'); SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag');
INSERT INTO t1 (b) SELECT b from t1; INSERT INTO t1 (b) SELECT b from t1;
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split'); --sorted_result
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed'); SELECT stat_name FROM mysql.innodb_index_stats WHERE table_name='t1';
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag');
--echo # Table rename should cause stats rename. --echo # Table rename should cause stats rename.
rename table t1 to t2; rename table t1 to t2;
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_page_split'); --sorted_result
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed'); SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_leaf_pages_defrag');
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t2%' and stat_name in ('n_page_split');
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t2%' and stat_name in ('n_pages_freed');
select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t2%' and stat_name in ('n_leaf_pages_defrag');
--echo # Drop index should cause stats drop, but will not. --echo # Drop index should cause stats drop, but will not.
drop index SECOND on t2; drop index SECOND on t2;
--sorted_result
SELECT stat_name, stat_value>0 FROM mysql.innodb_index_stats
WHERE table_name like '%t2%' AND index_name='SECOND';
--echo # --echo #
--echo # MDEV-26636: Statistics must not be written for temporary tables --echo # MDEV-26636: Statistics must not be written for temporary tables
--echo # --echo #
@ -89,13 +77,13 @@ INSERT INTO t SELECT seq, '' FROM seq_1_to_100;
--source include/restart_mysqld.inc --source include/restart_mysqld.inc
SELECT * FROM mysql.innodb_index_stats where table_name like '%t1%';
--sorted_result --sorted_result
SELECT table_name, index_name, stat_name, stat_value>0 SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
FROM mysql.innodb_index_stats;
--echo # Clean up --echo # Clean up
# Starting with 10.6, DROP TABLE will not touch persistent statistics
# (not defragmentation statistics either) if the table has none!
ALTER TABLE t2 STATS_PERSISTENT=1;
DROP TABLE t2; DROP TABLE t2;
SELECT * FROM mysql.innodb_index_stats; SELECT * FROM mysql.innodb_index_stats;

View File

@ -24,3 +24,19 @@ VARIABLE_VALUE>0 VARIABLE_NAME
1 Collation used latin1_swedish_ci 1 Collation used latin1_swedish_ci
1 Collation used utf8_bin 1 Collation used utf8_bin
1 Collation used utf8_general_ci 1 Collation used utf8_general_ci
prepare stmt from "SELECT VARIABLE_VALUE>0, VARIABLE_NAME FROM INFORMATION_SCHEMA.FEEDBACK WHERE VARIABLE_NAME LIKE 'Collation used %' ORDER BY VARIABLE_NAME";
execute stmt;
VARIABLE_VALUE>0 VARIABLE_NAME
1 Collation used binary
1 Collation used latin1_bin
1 Collation used latin1_swedish_ci
1 Collation used utf8_bin
1 Collation used utf8_general_ci
execute stmt;
VARIABLE_VALUE>0 VARIABLE_NAME
1 Collation used binary
1 Collation used latin1_bin
1 Collation used latin1_swedish_ci
1 Collation used utf8_bin
1 Collation used utf8_general_ci
deallocate prepare stmt;

View File

@ -42,3 +42,10 @@ if (`SELECT VERSION() LIKE '%embedded%'`)
SELECT VARIABLE_VALUE>0, VARIABLE_NAME FROM INFORMATION_SCHEMA.FEEDBACK SELECT VARIABLE_VALUE>0, VARIABLE_NAME FROM INFORMATION_SCHEMA.FEEDBACK
WHERE VARIABLE_NAME LIKE 'Collation used %' WHERE VARIABLE_NAME LIKE 'Collation used %'
ORDER BY VARIABLE_NAME; ORDER BY VARIABLE_NAME;
prepare stmt from "SELECT VARIABLE_VALUE>0, VARIABLE_NAME FROM INFORMATION_SCHEMA.FEEDBACK WHERE VARIABLE_NAME LIKE 'Collation used %' ORDER BY VARIABLE_NAME";
execute stmt;
execute stmt;
deallocate prepare stmt;

View File

@ -92,16 +92,18 @@ static COND * const OOM= (COND*)1;
static COND* make_cond(THD *thd, TABLE_LIST *tables, LEX_STRING *filter) static COND* make_cond(THD *thd, TABLE_LIST *tables, LEX_STRING *filter)
{ {
Item_cond_or *res= NULL; Item_cond_or *res= NULL;
Name_resolution_context nrc; /* A reference to this context will be stored in Item_field */
Name_resolution_context *nrc= new (thd->mem_root) Name_resolution_context;
const char *db= tables->db.str, *table= tables->alias.str; const char *db= tables->db.str, *table= tables->alias.str;
LEX_CSTRING *field= &tables->table->field[0]->field_name; LEX_CSTRING *field= &tables->table->field[0]->field_name;
CHARSET_INFO *cs= &my_charset_latin1; CHARSET_INFO *cs= &my_charset_latin1;
if (!filter->str) if (!filter->str || !nrc)
return 0; return 0;
nrc.init(); nrc->init();
nrc.resolve_in_table_list_only(tables); nrc->resolve_in_table_list_only(tables);
nrc->select_lex= tables->select_lex;
res= new (thd->mem_root) Item_cond_or(thd); res= new (thd->mem_root) Item_cond_or(thd);
if (!res) if (!res)
@ -109,7 +111,7 @@ static COND* make_cond(THD *thd, TABLE_LIST *tables, LEX_STRING *filter)
for (; filter->str; filter++) for (; filter->str; filter++)
{ {
Item_field *fld= new (thd->mem_root) Item_field(thd, &nrc, db, table, Item_field *fld= new (thd->mem_root) Item_field(thd, nrc, db, table,
field); field);
Item_string *pattern= new (thd->mem_root) Item_string(thd, filter->str, Item_string *pattern= new (thd->mem_root) Item_string(thd, filter->str,
(uint) filter->length, cs); (uint) filter->length, cs);

View File

@ -70,11 +70,12 @@ bool cmp_items(Item *a, Item *b)
/** /**
Set max_sum_func_level if it is needed Set max_sum_func_level if it is needed
*/ */
inline void set_max_sum_func_level(THD *thd, SELECT_LEX *select) inline void set_max_sum_func_level(SELECT_LEX *select)
{ {
if (thd->lex->in_sum_func && LEX *lex_s= select->parent_lex;
thd->lex->in_sum_func->nest_level >= select->nest_level) if (lex_s->in_sum_func &&
set_if_bigger(thd->lex->in_sum_func->max_sum_func_level, lex_s->in_sum_func->nest_level >= select->nest_level)
set_if_bigger(lex_s->in_sum_func->max_sum_func_level,
select->nest_level - 1); select->nest_level - 1);
} }
@ -768,6 +769,7 @@ Item_ident::Item_ident(THD *thd, Name_resolution_context *context_arg,
cached_table(0), depended_from(0), can_be_depended(TRUE) cached_table(0), depended_from(0), can_be_depended(TRUE)
{ {
name= *field_name_arg; name= *field_name_arg;
DBUG_ASSERT(!context || context->select_lex);
} }
@ -783,6 +785,7 @@ Item_ident::Item_ident(THD *thd, TABLE_LIST *view_arg,
cached_table(NULL), depended_from(NULL), can_be_depended(TRUE) cached_table(NULL), depended_from(NULL), can_be_depended(TRUE)
{ {
name= *field_name_arg; name= *field_name_arg;
DBUG_ASSERT(!context || context->select_lex);
} }
@ -804,7 +807,9 @@ Item_ident::Item_ident(THD *thd, Item_ident *item)
cached_table(item->cached_table), cached_table(item->cached_table),
depended_from(item->depended_from), depended_from(item->depended_from),
can_be_depended(item->can_be_depended) can_be_depended(item->can_be_depended)
{} {
DBUG_ASSERT(!context || context->select_lex);
}
void Item_ident::cleanup() void Item_ident::cleanup()
{ {
@ -5727,7 +5732,14 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
*/ */
Name_resolution_context *last_checked_context= context; Name_resolution_context *last_checked_context= context;
Item **ref= (Item **) not_found_item; Item **ref= (Item **) not_found_item;
SELECT_LEX *current_sel= thd->lex->current_select; /*
There are cases when name resolution context is absent (when we are not
doing name resolution), but here the name resolution context should
be present because we are doing name resolution
*/
DBUG_ASSERT(context);
SELECT_LEX *current_sel= context->select_lex;
LEX *lex_s= context->select_lex->parent_lex;
Name_resolution_context *outer_context= 0; Name_resolution_context *outer_context= 0;
SELECT_LEX *select= 0; SELECT_LEX *select= 0;
/* Currently derived tables cannot be correlated */ /* Currently derived tables cannot be correlated */
@ -5828,18 +5840,18 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
return -1; return -1;
thd->change_item_tree(reference, rf); thd->change_item_tree(reference, rf);
select->inner_refs_list.push_back(rf, thd->mem_root); select->inner_refs_list.push_back(rf, thd->mem_root);
rf->in_sum_func= thd->lex->in_sum_func; rf->in_sum_func= lex_s->in_sum_func;
} }
/* /*
A reference is resolved to a nest level that's outer or the same as A reference is resolved to a nest level that's outer or the same as
the nest level of the enclosing set function : adjust the value of the nest level of the enclosing set function : adjust the value of
max_arg_level for the function if it's needed. max_arg_level for the function if it's needed.
*/ */
if (thd->lex->in_sum_func && if (lex_s->in_sum_func &&
thd->lex->in_sum_func->nest_level >= select->nest_level) lex_s->in_sum_func->nest_level >= select->nest_level)
{ {
Item::Type ref_type= (*reference)->type(); Item::Type ref_type= (*reference)->type();
set_if_bigger(thd->lex->in_sum_func->max_arg_level, set_if_bigger(lex_s->in_sum_func->max_arg_level,
select->nest_level); select->nest_level);
set_field(*from_field); set_field(*from_field);
fixed= 1; fixed= 1;
@ -5860,10 +5872,10 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
((ref_type == REF_ITEM || ref_type == FIELD_ITEM) ? ((ref_type == REF_ITEM || ref_type == FIELD_ITEM) ?
(Item_ident*) (*reference) : (Item_ident*) (*reference) :
0), false); 0), false);
if (thd->lex->in_sum_func && if (lex_s->in_sum_func &&
thd->lex->in_sum_func->nest_level >= select->nest_level) lex_s->in_sum_func->nest_level >= select->nest_level)
{ {
set_if_bigger(thd->lex->in_sum_func->max_arg_level, set_if_bigger(lex_s->in_sum_func->max_arg_level,
select->nest_level); select->nest_level);
} }
/* /*
@ -5955,7 +5967,7 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
{ {
outer_context->select_lex->inner_refs_list.push_back((Item_outer_ref*)rf, outer_context->select_lex->inner_refs_list.push_back((Item_outer_ref*)rf,
thd->mem_root); thd->mem_root);
((Item_outer_ref*)rf)->in_sum_func= thd->lex->in_sum_func; ((Item_outer_ref*)rf)->in_sum_func= lex_s->in_sum_func;
} }
thd->change_item_tree(reference, rf); thd->change_item_tree(reference, rf);
/* /*
@ -5970,7 +5982,7 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
We can not "move" aggregate function in the place where We can not "move" aggregate function in the place where
its arguments are not defined. its arguments are not defined.
*/ */
set_max_sum_func_level(thd, select); set_max_sum_func_level(select);
mark_as_dependent(thd, last_checked_context->select_lex, mark_as_dependent(thd, last_checked_context->select_lex,
context->select_lex, rf, context->select_lex, rf,
rf, false); rf, false);
@ -5983,7 +5995,7 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
We can not "move" aggregate function in the place where We can not "move" aggregate function in the place where
its arguments are not defined. its arguments are not defined.
*/ */
set_max_sum_func_level(thd, select); set_max_sum_func_level(select);
mark_as_dependent(thd, last_checked_context->select_lex, mark_as_dependent(thd, last_checked_context->select_lex,
context->select_lex, context->select_lex,
this, (Item_ident*)*reference, false); this, (Item_ident*)*reference, false);
@ -6061,7 +6073,20 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
DBUG_ASSERT(fixed == 0); DBUG_ASSERT(fixed == 0);
Field *from_field= (Field *)not_found_field; Field *from_field= (Field *)not_found_field;
bool outer_fixed= false; bool outer_fixed= false;
SELECT_LEX *select= thd->lex->current_select; SELECT_LEX *select;
LEX *lex_s;
if (context)
{
select= context->select_lex;
lex_s= context->select_lex->parent_lex;
}
else
{
// No real name resolution, used somewhere in SP
DBUG_ASSERT(field);
select= NULL;
lex_s= NULL;
}
if (select && select->in_tvc) if (select && select->in_tvc)
{ {
@ -6129,7 +6154,7 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
We can not "move" aggregate function in the place where We can not "move" aggregate function in the place where
its arguments are not defined. its arguments are not defined.
*/ */
set_max_sum_func_level(thd, select); set_max_sum_func_level(select);
set_field(new_field); set_field(new_field);
depended_from= (*((Item_field**)res))->depended_from; depended_from= (*((Item_field**)res))->depended_from;
return 0; return 0;
@ -6157,7 +6182,7 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
We can not "move" aggregate function in the place where We can not "move" aggregate function in the place where
its arguments are not defined. its arguments are not defined.
*/ */
set_max_sum_func_level(thd, select); set_max_sum_func_level(select);
return FALSE; return FALSE;
} }
} }
@ -6194,10 +6219,11 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
goto mark_non_agg_field; goto mark_non_agg_field;
} }
if (thd->lex->in_sum_func && if (lex_s &&
thd->lex->in_sum_func->nest_level == lex_s->in_sum_func &&
lex_s->in_sum_func->nest_level ==
select->nest_level) select->nest_level)
set_if_bigger(thd->lex->in_sum_func->max_arg_level, set_if_bigger(lex_s->in_sum_func->max_arg_level,
select->nest_level); select->nest_level);
/* /*
if it is not expression from merged VIEW we will set this field. if it is not expression from merged VIEW we will set this field.
@ -6263,8 +6289,9 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
if (field->vcol_info) if (field->vcol_info)
fix_session_vcol_expr_for_read(thd, field, field->vcol_info); fix_session_vcol_expr_for_read(thd, field, field->vcol_info);
if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY && if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY &&
!outer_fixed && !thd->lex->in_sum_func && !outer_fixed &&
select && select &&
!lex_s->in_sum_func &&
select->cur_pos_in_select_list != UNDEF_POS && select->cur_pos_in_select_list != UNDEF_POS &&
select->join) select->join)
{ {
@ -6299,13 +6326,13 @@ mark_non_agg_field:
*/ */
select_lex= context->select_lex; select_lex= context->select_lex;
} }
if (!thd->lex->in_sum_func) if (!lex_s || !lex_s->in_sum_func)
select_lex->set_non_agg_field_used(true); select_lex->set_non_agg_field_used(true);
else else
{ {
if (outer_fixed) if (outer_fixed)
thd->lex->in_sum_func->outer_fields.push_back(this, thd->mem_root); lex_s->in_sum_func->outer_fields.push_back(this, thd->mem_root);
else if (thd->lex->in_sum_func->nest_level != else if (lex_s->in_sum_func->nest_level !=
select->nest_level) select->nest_level)
select_lex->set_non_agg_field_used(true); select_lex->set_non_agg_field_used(true);
} }
@ -7582,6 +7609,12 @@ Item *get_field_item_for_having(THD *thd, Item *item, st_select_lex *sel)
return NULL; return NULL;
} }
Item *Item_ident::derived_field_transformer_for_having(THD *thd, uchar *arg)
{
st_select_lex *sel= (st_select_lex *)arg;
context= &sel->context;
return this;
}
Item *Item_field::derived_field_transformer_for_having(THD *thd, uchar *arg) Item *Item_field::derived_field_transformer_for_having(THD *thd, uchar *arg)
{ {
@ -7601,12 +7634,13 @@ Item *Item_field::derived_field_transformer_for_having(THD *thd, uchar *arg)
Item *Item_direct_view_ref::derived_field_transformer_for_having(THD *thd, Item *Item_direct_view_ref::derived_field_transformer_for_having(THD *thd,
uchar *arg) uchar *arg)
{ {
st_select_lex *sel= (st_select_lex *)arg;
context= &sel->context;
if ((*ref)->marker & SUBSTITUTION_FL) if ((*ref)->marker & SUBSTITUTION_FL)
{ {
this->marker|= SUBSTITUTION_FL; this->marker|= SUBSTITUTION_FL;
return this; return this;
} }
st_select_lex *sel= (st_select_lex *)arg;
table_map tab_map= sel->master_unit()->derived->table->map; table_map tab_map= sel->master_unit()->derived->table->map;
if ((item_equal && !(item_equal->used_tables() & tab_map)) || if ((item_equal && !(item_equal->used_tables() & tab_map)) ||
!item_equal) !item_equal)
@ -7903,7 +7937,9 @@ bool Item_ref::fix_fields(THD *thd, Item **reference)
{ {
enum_parsing_place place= NO_MATTER; enum_parsing_place place= NO_MATTER;
DBUG_ASSERT(fixed == 0); DBUG_ASSERT(fixed == 0);
SELECT_LEX *current_sel= thd->lex->current_select;
SELECT_LEX *current_sel= context->select_lex;
LEX *lex_s= context->select_lex->parent_lex;
if (set_properties_only) if (set_properties_only)
{ {
@ -8064,10 +8100,10 @@ bool Item_ref::fix_fields(THD *thd, Item **reference)
the nest level of the enclosing set function : adjust the value of the nest level of the enclosing set function : adjust the value of
max_arg_level for the function if it's needed. max_arg_level for the function if it's needed.
*/ */
if (thd->lex->in_sum_func && if (lex_s->in_sum_func &&
thd->lex->in_sum_func->nest_level >= lex_s->in_sum_func->nest_level >=
last_checked_context->select_lex->nest_level) last_checked_context->select_lex->nest_level)
set_if_bigger(thd->lex->in_sum_func->max_arg_level, set_if_bigger(lex_s->in_sum_func->max_arg_level,
last_checked_context->select_lex->nest_level); last_checked_context->select_lex->nest_level);
return FALSE; return FALSE;
} }
@ -8087,10 +8123,10 @@ bool Item_ref::fix_fields(THD *thd, Item **reference)
the nest level of the enclosing set function : adjust the value of the nest level of the enclosing set function : adjust the value of
max_arg_level for the function if it's needed. max_arg_level for the function if it's needed.
*/ */
if (thd->lex->in_sum_func && if (lex_s->in_sum_func &&
thd->lex->in_sum_func->nest_level >= lex_s->in_sum_func->nest_level >=
last_checked_context->select_lex->nest_level) last_checked_context->select_lex->nest_level)
set_if_bigger(thd->lex->in_sum_func->max_arg_level, set_if_bigger(lex_s->in_sum_func->max_arg_level,
last_checked_context->select_lex->nest_level); last_checked_context->select_lex->nest_level);
} }
} }

View File

@ -2967,6 +2967,7 @@ public:
Collect outer references Collect outer references
*/ */
virtual bool collect_outer_ref_processor(void *arg); virtual bool collect_outer_ref_processor(void *arg);
Item *derived_field_transformer_for_having(THD *thd, uchar *arg);
friend bool insert_fields(THD *thd, Name_resolution_context *context, friend bool insert_fields(THD *thd, Name_resolution_context *context,
const char *db_name, const char *db_name,
const char *table_name, List_iterator<Item> *it, const char *table_name, List_iterator<Item> *it,

View File

@ -5186,8 +5186,9 @@ bool subselect_hash_sj_engine::make_semi_join_conds()
tmp_table_ref->init_one_table(&empty_clex_str, &table_name, NULL, TL_READ); tmp_table_ref->init_one_table(&empty_clex_str, &table_name, NULL, TL_READ);
tmp_table_ref->table= tmp_table; tmp_table_ref->table= tmp_table;
context= new Name_resolution_context; context= new (thd->mem_root) Name_resolution_context;
context->init(); context->init();
context->select_lex= item_in->unit->first_select();
context->first_name_resolution_table= context->first_name_resolution_table=
context->last_name_resolution_table= tmp_table_ref; context->last_name_resolution_table= tmp_table_ref;
semi_join_conds_context= context; semi_join_conds_context= context;

View File

@ -72,6 +72,7 @@ size_t Item_sum::ram_limitation(THD *thd)
bool Item_sum::init_sum_func_check(THD *thd) bool Item_sum::init_sum_func_check(THD *thd)
{ {
SELECT_LEX *curr_sel= thd->lex->current_select; SELECT_LEX *curr_sel= thd->lex->current_select;
LEX *lex_s= (curr_sel ? curr_sel->parent_lex : thd->lex);
if (curr_sel && curr_sel->name_visibility_map.is_clear_all()) if (curr_sel && curr_sel->name_visibility_map.is_clear_all())
{ {
for (SELECT_LEX *sl= curr_sel; sl; sl= sl->context.outer_select()) for (SELECT_LEX *sl= curr_sel; sl; sl= sl->context.outer_select())
@ -87,9 +88,9 @@ bool Item_sum::init_sum_func_check(THD *thd)
return TRUE; return TRUE;
} }
/* Set a reference to the nesting set function if there is any */ /* Set a reference to the nesting set function if there is any */
in_sum_func= thd->lex->in_sum_func; in_sum_func= lex_s->in_sum_func;
/* Save a pointer to object to be used in items for nested set functions */ /* Save a pointer to object to be used in items for nested set functions */
thd->lex->in_sum_func= this; lex_s->in_sum_func= this;
nest_level= thd->lex->current_select->nest_level; nest_level= thd->lex->current_select->nest_level;
ref_by= 0; ref_by= 0;
aggr_level= -1; aggr_level= -1;
@ -156,6 +157,7 @@ bool Item_sum::init_sum_func_check(THD *thd)
bool Item_sum::check_sum_func(THD *thd, Item **ref) bool Item_sum::check_sum_func(THD *thd, Item **ref)
{ {
SELECT_LEX *curr_sel= thd->lex->current_select; SELECT_LEX *curr_sel= thd->lex->current_select;
LEX *lex_s= curr_sel->parent_lex;
nesting_map allow_sum_func(thd->lex->allow_sum_func); nesting_map allow_sum_func(thd->lex->allow_sum_func);
allow_sum_func.intersect(curr_sel->name_visibility_map); allow_sum_func.intersect(curr_sel->name_visibility_map);
bool invalid= FALSE; bool invalid= FALSE;
@ -318,7 +320,7 @@ bool Item_sum::check_sum_func(THD *thd, Item **ref)
if (sum_func() == SP_AGGREGATE_FUNC) if (sum_func() == SP_AGGREGATE_FUNC)
aggr_sel->set_custom_agg_func_used(true); aggr_sel->set_custom_agg_func_used(true);
update_used_tables(); update_used_tables();
thd->lex->in_sum_func= in_sum_func; lex_s->in_sum_func= in_sum_func;
return FALSE; return FALSE;
} }

View File

@ -6736,6 +6736,7 @@ set_new_item_local_context(THD *thd, Item_ident *item, TABLE_LIST *table_ref)
if (!(context= new (thd->mem_root) Name_resolution_context)) if (!(context= new (thd->mem_root) Name_resolution_context))
return TRUE; return TRUE;
context->init(); context->init();
context->select_lex= table_ref->select_lex;
context->first_name_resolution_table= context->first_name_resolution_table=
context->last_name_resolution_table= table_ref; context->last_name_resolution_table= table_ref;
item->context= context; item->context= context;

View File

@ -3027,6 +3027,7 @@ void reinit_stmt_before_use(THD *thd, LEX *lex)
} }
for (; sl; sl= sl->next_select_in_list()) for (; sl; sl= sl->next_select_in_list())
{ {
sl->parent_lex->in_sum_func= NULL;
if (sl->changed_elements & TOUCHED_SEL_COND) if (sl->changed_elements & TOUCHED_SEL_COND)
{ {
/* remove option which was put by mysql_explain_union() */ /* remove option which was put by mysql_explain_union() */
@ -3157,7 +3158,6 @@ void reinit_stmt_before_use(THD *thd, LEX *lex)
lex->result->set_thd(thd); lex->result->set_thd(thd);
} }
lex->allow_sum_func.clear_all(); lex->allow_sum_func.clear_all();
lex->in_sum_func= NULL;
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }