summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/main/errors.result4
-rw-r--r--mysql-test/main/errors.test2
-rw-r--r--mysql-test/main/sp-bugs.result4
-rw-r--r--mysql-test/main/sp-lock.result8
-rw-r--r--mysql-test/main/sp-lock.test3
-rw-r--r--mysql-test/main/sp.result22
-rw-r--r--mysql-test/main/sp.test17
-rw-r--r--mysql-test/main/view.result43
-rw-r--r--mysql-test/main/view.test49
-rw-r--r--mysql-test/suite/compat/oracle/r/sp-package.result8
-rw-r--r--mysql-test/suite/galera/r/galera_fulltext.result28
-rw-r--r--mysql-test/suite/galera/t/galera_fulltext.test43
-rw-r--r--mysql-test/suite/innodb/r/innodb_defrag_stats.result229
-rw-r--r--mysql-test/suite/innodb/t/innodb_defrag_stats.test76
-rw-r--r--mysql-test/suite/innodb/t/undo_truncate.test4
-rw-r--r--mysql-test/suite/plugins/r/feedback_plugin_load.result16
-rw-r--r--mysql-test/suite/plugins/t/feedback_plugin_load.test7
-rw-r--r--plugin/feedback/feedback.cc12
-rw-r--r--sql/item.cc104
-rw-r--r--sql/item.h1
-rw-r--r--sql/item_subselect.cc3
-rw-r--r--sql/item_sum.cc8
-rw-r--r--sql/mysql_upgrade_service.cc14
-rw-r--r--sql/sp.cc16
-rw-r--r--sql/sql_base.cc1
-rw-r--r--sql/sql_prepare.cc2
26 files changed, 436 insertions, 288 deletions
diff --git a/mysql-test/main/errors.result b/mysql-test/main/errors.result
index 44193865493..baa2e0ad3c0 100644
--- a/mysql-test/main/errors.result
+++ b/mysql-test/main/errors.result
@@ -224,10 +224,10 @@ SELECT 4;
END IF ;
END"where name = "P1";
show create procedure P1;
-ERROR HY000: Failed to load routine test.P1 (internal code -6). For more details, run SHOW WARNINGS
+ERROR 42000: Undeclared variable: foo
show warnings;
Level Code Message
Error 1327 Undeclared variable: foo
-Error 1457 Failed to load routine test.P1 (internal code -6). For more details, run SHOW WARNINGS
+Error 1305 PROCEDURE P1 does not exist
drop procedure P1;
# End of 10.4 tests
diff --git a/mysql-test/main/errors.test b/mysql-test/main/errors.test
index a4b95d48e5d..1948eebfcb3 100644
--- a/mysql-test/main/errors.test
+++ b/mysql-test/main/errors.test
@@ -275,7 +275,7 @@ SELECT 4;
END IF ;
END"where name = "P1";
---error ER_SP_PROC_TABLE_CORRUPT
+--error ER_SP_UNDECLARED_VAR
show create procedure P1;
show warnings;
diff --git a/mysql-test/main/sp-bugs.result b/mysql-test/main/sp-bugs.result
index 665e787442d..8c6788d03f4 100644
--- a/mysql-test/main/sp-bugs.result
+++ b/mysql-test/main/sp-bugs.result
@@ -168,7 +168,7 @@ RETURN 0;
END latin1 latin1_swedish_ci latin1_swedish_ci
SHOW CREATE FUNCTION TESTF_bug11763507;
Function sql_mode Create Function character_set_client collation_connection Database Collation
-testf_bug11763507 CREATE DEFINER=`root`@`localhost` FUNCTION `testf_bug11763507`() RETURNS int(11)
+TESTF_bug11763507 CREATE DEFINER=`root`@`localhost` FUNCTION `TESTF_bug11763507`() RETURNS int(11)
BEGIN
RETURN 0;
END latin1 latin1_swedish_ci latin1_swedish_ci
@@ -198,7 +198,7 @@ SELECT "PROCEDURE testp_bug11763507";
END latin1 latin1_swedish_ci latin1_swedish_ci
SHOW CREATE PROCEDURE TESTP_bug11763507;
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
-testp_bug11763507 CREATE DEFINER=`root`@`localhost` PROCEDURE `testp_bug11763507`()
+TESTP_bug11763507 CREATE DEFINER=`root`@`localhost` PROCEDURE `TESTP_bug11763507`()
BEGIN
SELECT "PROCEDURE testp_bug11763507";
END latin1 latin1_swedish_ci latin1_swedish_ci
diff --git a/mysql-test/main/sp-lock.result b/mysql-test/main/sp-lock.result
index acf951f6676..ec8d8970ae3 100644
--- a/mysql-test/main/sp-lock.result
+++ b/mysql-test/main/sp-lock.result
@@ -703,9 +703,6 @@ connection default;
#
# SHOW CREATE PROCEDURE p1 called from p1, after p1 was altered
#
-# We are just covering the existing behaviour with tests. The
-# results are not necessarily correct."
-#
CREATE PROCEDURE p1()
BEGIN
SELECT get_lock("test", 10);
@@ -736,10 +733,7 @@ get_lock("test", 10)
1
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
p1 STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`()
-BEGIN
-SELECT get_lock("test", 10);
-SHOW CREATE PROCEDURE p1;
-END latin1 latin1_swedish_ci latin1_swedish_ci
+BEGIN END latin1 latin1_swedish_ci latin1_swedish_ci
connection con3;
disconnect con3;
connection con2;
diff --git a/mysql-test/main/sp-lock.test b/mysql-test/main/sp-lock.test
index 83ea07d4bda..703c59e8f28 100644
--- a/mysql-test/main/sp-lock.test
+++ b/mysql-test/main/sp-lock.test
@@ -807,9 +807,6 @@ connection default;
--echo #
--echo # SHOW CREATE PROCEDURE p1 called from p1, after p1 was altered
--echo #
---echo # We are just covering the existing behaviour with tests. The
---echo # results are not necessarily correct."
---echo #
delimiter |;
CREATE PROCEDURE p1()
diff --git a/mysql-test/main/sp.result b/mysql-test/main/sp.result
index 35ec5fc628f..e30226a47e0 100644
--- a/mysql-test/main/sp.result
+++ b/mysql-test/main/sp.result
@@ -8874,6 +8874,28 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
BEGIN
RETURN '';
END' at line 2
+SELECT VARIABLE_VALUE into @global_mem_used FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='MEMORY_USED';
+SELECT VARIABLE_VALUE into @local_mem_used FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME='MEMORY_USED';
+CREATE PROCEDURE sp0() SELECT 1;
+SHOW CREATE PROCEDURE sp0;
+Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
+sp0 STRICT_ALL_TABLES CREATE DEFINER=`root`@`localhost` PROCEDURE `sp0`()
+SELECT 1 latin1 latin1_swedish_ci latin1_swedish_ci
+DROP PROCEDURE sp0;
+SELECT VARIABLE_VALUE into @global_mem_used FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='MEMORY_USED';
+SELECT VARIABLE_VALUE into @local_mem_used FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME='MEMORY_USED';
+CREATE PROCEDURE sp1() SELECT 1;
+SHOW CREATE PROCEDURE sp1;
+Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
+sp1 STRICT_ALL_TABLES CREATE DEFINER=`root`@`localhost` PROCEDURE `sp1`()
+SELECT 1 latin1 latin1_swedish_ci latin1_swedish_ci
+SELECT VARIABLE_VALUE-@local_mem_used FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME='MEMORY_USED';
+VARIABLE_VALUE-@local_mem_used
+0
+SELECT VARIABLE_VALUE-@global_mem_used FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='MEMORY_USED';
+VARIABLE_VALUE-@global_mem_used
+0
+DROP PROCEDURE sp1;
# End of 10.3 tests
#
# Start of 10.4 tests
diff --git a/mysql-test/main/sp.test b/mysql-test/main/sp.test
index c9528c1ccb9..283289d7a93 100644
--- a/mysql-test/main/sp.test
+++ b/mysql-test/main/sp.test
@@ -10418,6 +10418,23 @@ END;
$$
DELIMITER ;$$
+# MDEV-20699 do not cache SP in SHOW CREATE
+# Warmup round, this might allocate some memory for session variable
+# and the output
+SELECT VARIABLE_VALUE into @global_mem_used FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='MEMORY_USED';
+SELECT VARIABLE_VALUE into @local_mem_used FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME='MEMORY_USED';
+CREATE PROCEDURE sp0() SELECT 1;
+SHOW CREATE PROCEDURE sp0;
+DROP PROCEDURE sp0;
+
+#Check that CREATE/SHOW does not use memory in caches.
+SELECT VARIABLE_VALUE into @global_mem_used FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='MEMORY_USED';
+SELECT VARIABLE_VALUE into @local_mem_used FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME='MEMORY_USED';
+CREATE PROCEDURE sp1() SELECT 1;
+SHOW CREATE PROCEDURE sp1;
+SELECT VARIABLE_VALUE-@local_mem_used FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME='MEMORY_USED';
+SELECT VARIABLE_VALUE-@global_mem_used FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='MEMORY_USED';
+DROP PROCEDURE sp1;
--echo # End of 10.3 tests
diff --git a/mysql-test/main/view.result b/mysql-test/main/view.result
index de4be4efda5..946c19f6c24 100644
--- a/mysql-test/main/view.result
+++ b/mysql-test/main/view.result
@@ -6789,6 +6789,49 @@ sum(z)
DROP TABLE t1;
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
#
#
diff --git a/mysql-test/main/view.test b/mysql-test/main/view.test
index ca5456930ba..ef985d69af6 100644
--- a/mysql-test/main/view.test
+++ b/mysql-test/main/view.test
@@ -6501,6 +6501,55 @@ DROP TABLE t1;
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 # End of 10.2 tests
--echo #
diff --git a/mysql-test/suite/compat/oracle/r/sp-package.result b/mysql-test/suite/compat/oracle/r/sp-package.result
index e7ab4eaa4a2..42159ccad54 100644
--- a/mysql-test/suite/compat/oracle/r/sp-package.result
+++ b/mysql-test/suite/compat/oracle/r/sp-package.result
@@ -727,6 +727,10 @@ END
character_set_client latin1
collation_connection latin1_swedish_ci
Database Collation latin1_swedish_ci
+Warnings:
+Level Note
+Code 1585
+Message This function 'concat' has the same name as a native function
SHOW CREATE PACKAGE BODY test2;
Package body test2
sql_mode PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SIMULTANEOUS_ASSIGNMENT
@@ -747,6 +751,10 @@ END
character_set_client latin1
collation_connection latin1_swedish_ci
Database Collation latin1_swedish_ci
+Warnings:
+Level Note
+Code 1585
+Message This function 'concat' has the same name as a native function
DROP PACKAGE BODY test2;
SELECT test2.f1();
ERROR 42000: FUNCTION test.test2.f1 does not exist
diff --git a/mysql-test/suite/galera/r/galera_fulltext.result b/mysql-test/suite/galera/r/galera_fulltext.result
index 12b29209f7e..a22296278fa 100644
--- a/mysql-test/suite/galera/r/galera_fulltext.result
+++ b/mysql-test/suite/galera/r/galera_fulltext.result
@@ -36,31 +36,3 @@ COUNT(f1) = 1000
1
DROP TABLE t1;
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;
diff --git a/mysql-test/suite/galera/t/galera_fulltext.test b/mysql-test/suite/galera/t/galera_fulltext.test
index 76c29da4123..7e2fc5e581d 100644
--- a/mysql-test/suite/galera/t/galera_fulltext.test
+++ b/mysql-test/suite/galera/t/galera_fulltext.test
@@ -1,6 +1,4 @@
---source include/big_test.inc
--source include/galera_cluster.inc
---source include/have_innodb.inc
#
# InnoDB FULLTEXT indexes
@@ -63,24 +61,25 @@ DROP TABLE ten;
#
# Case 2: UTF-8
+# TODO: MDEV-24978
#
---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);
-SELECT COUNT(*) FROM t;
-
---connection node_2
-SELECT COUNT(*) FROM t;
-
---connection node_1
-DROP TABLE t;
-CREATE TABLE t (a VARCHAR(5000)) engine=innodb DEFAULT CHARSET=utf8;
-INSERT IGNORE INTO t VALUES(@value);
-SELECT COUNT(*) FROM t;
-
---connection node_2
-SELECT COUNT(*) FROM t;
-
---connection node_1
-DROP TABLE t;
+#--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);
+#SELECT COUNT(*) FROM t;
+#
+#--connection node_2
+#SELECT COUNT(*) FROM t;
+#
+#--connection node_1
+#DROP TABLE t;
+#CREATE TABLE t (a VARCHAR(5000)) engine=innodb DEFAULT CHARSET=utf8;
+#INSERT IGNORE INTO t VALUES(@value);
+#SELECT COUNT(*) FROM t;
+#
+#--connection node_2
+#SELECT COUNT(*) FROM t;
+#
+#--connection node_1
+#DROP TABLE t;
diff --git a/mysql-test/suite/innodb/r/innodb_defrag_stats.result b/mysql-test/suite/innodb/r/innodb_defrag_stats.result
index b60f5f5c5a9..d362608de79 100644
--- a/mysql-test/suite/innodb/r/innodb_defrag_stats.result
+++ b/mysql-test/suite/innodb/r/innodb_defrag_stats.result
@@ -1,123 +1,118 @@
SET GLOBAL innodb_defragment_stats_accuracy = 20;
DELETE FROM mysql.innodb_index_stats;
# Create table.
-CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b VARCHAR(256), KEY SECOND(a, b)) ENGINE=INNODB;
-INSERT INTO t1 SELECT seq, REPEAT('A', 256) FROM seq_1_to_1024;
+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 100*FLOOR(seq/70)+seq%70, REPEAT('A', 256)
+FROM seq_1_to_1024;
# 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');
-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
-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.
+SELECT * FROM mysql.innodb_index_stats;
+database_name table_name index_name last_update stat_name stat_value sample_size stat_description
+INSERT INTO t1 SELECT 100*FLOOR(seq/70)+seq%70, REPEAT('A', 256)
+FROM seq_1025_to_1433;
BEGIN;
-delete from t1 where a between 100 * 20 and 100 * 20 + 30;
-delete from t1 where a between 100 * 19 and 100 * 19 + 30;
-delete from t1 where a between 100 * 18 and 100 * 18 + 30;
-delete from t1 where a between 100 * 17 and 100 * 17 + 30;
-delete from t1 where a between 100 * 16 and 100 * 16 + 30;
-delete from t1 where a between 100 * 15 and 100 * 15 + 30;
-delete from t1 where a between 100 * 14 and 100 * 14 + 30;
-delete from t1 where a between 100 * 13 and 100 * 13 + 30;
-delete from t1 where a between 100 * 12 and 100 * 12 + 30;
-delete from t1 where a between 100 * 11 and 100 * 11 + 30;
-delete from t1 where a between 100 * 10 and 100 * 10 + 30;
-delete from t1 where a between 100 * 9 and 100 * 9 + 30;
-delete from t1 where a between 100 * 8 and 100 * 8 + 30;
-delete from t1 where a between 100 * 7 and 100 * 7 + 30;
-delete from t1 where a between 100 * 6 and 100 * 6 + 30;
-delete from t1 where a between 100 * 5 and 100 * 5 + 30;
-delete from t1 where a between 100 * 4 and 100 * 4 + 30;
-delete from t1 where a between 100 * 3 and 100 * 3 + 30;
-delete from t1 where a between 100 * 2 and 100 * 2 + 30;
-delete from t1 where a between 100 * 1 and 100 * 1 + 30;
-COMMIT;
-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
+INSERT INTO t1 SELECT 100*20+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*19+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*18+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*17+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*16+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*15+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*14+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*13+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*12+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*11+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*10+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*9+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*8+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+INSERT INTO t1 SELECT 100*7+seq, REPEAT('A', 256)
+FROM seq_70_to_99;
+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
+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;
Table Op Msg_type Msg_text
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');
-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
+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 PRIMARY n_pages_freed
+t1 SECOND n_leaf_pages_defrag
+t1 SECOND n_leaf_pages_reserved
+t1 SECOND n_page_split
+t1 SECOND n_pages_freed
set global innodb_defragment_stats_accuracy = 40;
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');
-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
+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 PRIMARY n_pages_freed
+t1 SECOND n_leaf_pages_defrag
+t1 SECOND n_leaf_pages_reserved
+t1 SECOND n_page_split
+t1 SECOND n_pages_freed
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');
-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
+SELECT stat_name FROM mysql.innodb_index_stats WHERE table_name='t1';
+stat_name
+n_leaf_pages_defrag
+n_leaf_pages_defrag
+n_leaf_pages_reserved
+n_leaf_pages_reserved
+n_page_split
+n_page_split
+n_pages_freed
+n_pages_freed
# Table rename should cause stats rename.
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');
-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
-select count(stat_value) > 0 from mysql.innodb_index_stats where table_name like '%t2%' 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 '%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
+SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
+table_name index_name stat_name
+t2 PRIMARY n_leaf_pages_defrag
+t2 PRIMARY n_leaf_pages_reserved
+t2 PRIMARY n_page_split
+t2 PRIMARY n_pages_freed
+t2 SECOND n_leaf_pages_defrag
+t2 SECOND n_leaf_pages_reserved
+t2 SECOND n_page_split
+t2 SECOND n_pages_freed
# Drop index should cause stats drop, but will not.
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
#
@@ -126,20 +121,18 @@ CREATE TEMPORARY TABLE t (a INT PRIMARY KEY, c CHAR(255) NOT NULL)
ENGINE=InnoDB;
INSERT INTO t SELECT seq, '' FROM seq_1_to_100;
# restart
-SELECT * FROM mysql.innodb_index_stats where table_name like '%t1%';
-database_name table_name index_name last_update stat_name stat_value sample_size stat_description
-SELECT table_name, index_name, stat_name, stat_value>0
-FROM mysql.innodb_index_stats;
-table_name index_name stat_name stat_value>0
-t2 PRIMARY n_leaf_pages_defrag 1
-t2 PRIMARY n_leaf_pages_reserved 1
-t2 PRIMARY n_page_split 1
-t2 PRIMARY n_pages_freed 1
-t2 SECOND n_leaf_pages_defrag 1
-t2 SECOND n_leaf_pages_reserved 1
-t2 SECOND n_page_split 1
-t2 SECOND n_pages_freed 1
+SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
+table_name index_name stat_name
+t2 PRIMARY n_leaf_pages_defrag
+t2 PRIMARY n_leaf_pages_reserved
+t2 PRIMARY n_page_split
+t2 PRIMARY n_pages_freed
+t2 SECOND n_leaf_pages_defrag
+t2 SECOND n_leaf_pages_reserved
+t2 SECOND n_page_split
+t2 SECOND n_pages_freed
# Clean up
+ALTER TABLE t2 STATS_PERSISTENT=1;
DROP TABLE t2;
SELECT * FROM mysql.innodb_index_stats;
database_name table_name index_name last_update stat_name stat_value sample_size stat_description
diff --git a/mysql-test/suite/innodb/t/innodb_defrag_stats.test b/mysql-test/suite/innodb/t/innodb_defrag_stats.test
index e1e88a07477..799faa93ff0 100644
--- a/mysql-test/suite/innodb/t/innodb_defrag_stats.test
+++ b/mysql-test/suite/innodb/t/innodb_defrag_stats.test
@@ -8,77 +8,65 @@ SET GLOBAL innodb_defragment_stats_accuracy = 20;
DELETE FROM mysql.innodb_index_stats;
--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.
-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');
-
-INSERT INTO t1 SELECT seq, REPEAT('A', 256) FROM seq_1025_to_2048;
+SELECT * FROM mysql.innodb_index_stats;
---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');
+INSERT INTO t1 SELECT 100*FLOOR(seq/70)+seq%70, REPEAT('A', 256)
+FROM seq_1025_to_1433;
---echo # Delete some rows.
BEGIN;
let $num_delete = 20;
while ($num_delete)
{
- let $j = 100 * $num_delete;
- eval delete from t1 where a between $j and $j + 30;
+ eval INSERT INTO t1 SELECT 100*$num_delete+seq, REPEAT('A', 256)
+ FROM seq_70_to_99;
dec $num_delete;
}
-COMMIT;
+ROLLBACK;
+
+SELECT @@GLOBAL.innodb_force_recovery<2 "have background defragmentation";
+
+# Wait for defrag_pool to be processed.
-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');
+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;
-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');
+--sorted_result
+SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
set global innodb_defragment_stats_accuracy = 40;
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 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');
-
+--sorted_result
+SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
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 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');
-
+--sorted_result
+SELECT stat_name FROM mysql.innodb_index_stats WHERE table_name='t1';
--echo # Table rename should cause stats rename.
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 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');
-
-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');
+--sorted_result
+SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
--echo # Drop index should cause stats drop, but will not.
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 # MDEV-26636: Statistics must not be written for temporary tables
--echo #
@@ -89,13 +77,13 @@ INSERT INTO t SELECT seq, '' FROM seq_1_to_100;
--source include/restart_mysqld.inc
-SELECT * FROM mysql.innodb_index_stats where table_name like '%t1%';
-
--sorted_result
-SELECT table_name, index_name, stat_name, stat_value>0
-FROM mysql.innodb_index_stats;
+SELECT table_name, index_name, stat_name FROM mysql.innodb_index_stats;
--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;
SELECT * FROM mysql.innodb_index_stats;
diff --git a/mysql-test/suite/innodb/t/undo_truncate.test b/mysql-test/suite/innodb/t/undo_truncate.test
index ae6ff93cce1..78cfc20b054 100644
--- a/mysql-test/suite/innodb/t/undo_truncate.test
+++ b/mysql-test/suite/innodb/t/undo_truncate.test
@@ -50,7 +50,7 @@ let $trx_after= `select substr('$trx_after',9)`;
drop table t1, t2;
-if ($trx_before != $trx_after)
+if ($trx_before > $trx_after)
{
- echo Transaction sequence mismatch: $trx_before != $trx_after;
+ echo Transaction sequence mismatch: $trx_before > $trx_after;
}
diff --git a/mysql-test/suite/plugins/r/feedback_plugin_load.result b/mysql-test/suite/plugins/r/feedback_plugin_load.result
index d76625bd3e2..4323dcce0a6 100644
--- a/mysql-test/suite/plugins/r/feedback_plugin_load.result
+++ b/mysql-test/suite/plugins/r/feedback_plugin_load.result
@@ -24,3 +24,19 @@ VARIABLE_VALUE>0 VARIABLE_NAME
1 Collation used utf8mb4_bin
1 Collation used utf8_bin
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_swedish_ci
+1 Collation used utf8mb4_bin
+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_swedish_ci
+1 Collation used utf8mb4_bin
+1 Collation used utf8_bin
+1 Collation used utf8_general_ci
+deallocate prepare stmt;
diff --git a/mysql-test/suite/plugins/t/feedback_plugin_load.test b/mysql-test/suite/plugins/t/feedback_plugin_load.test
index ecf678eb420..f67397afdfe 100644
--- a/mysql-test/suite/plugins/t/feedback_plugin_load.test
+++ b/mysql-test/suite/plugins/t/feedback_plugin_load.test
@@ -42,3 +42,10 @@ if (`SELECT VERSION() LIKE '%embedded%'`)
SELECT VARIABLE_VALUE>0, VARIABLE_NAME FROM INFORMATION_SCHEMA.FEEDBACK
WHERE VARIABLE_NAME LIKE 'Collation used %'
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;
diff --git a/plugin/feedback/feedback.cc b/plugin/feedback/feedback.cc
index 75e9a1e430e..a7bc1d3d60e 100644
--- a/plugin/feedback/feedback.cc
+++ b/plugin/feedback/feedback.cc
@@ -92,16 +92,18 @@ static COND * const OOM= (COND*)1;
static COND* make_cond(THD *thd, TABLE_LIST *tables, LEX_STRING *filter)
{
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;
LEX_CSTRING *field= &tables->table->field[0]->field_name;
CHARSET_INFO *cs= &my_charset_latin1;
- if (!filter->str)
+ if (!filter->str || !nrc)
return 0;
- nrc.init();
- nrc.resolve_in_table_list_only(tables);
+ nrc->init();
+ nrc->resolve_in_table_list_only(tables);
+ nrc->select_lex= tables->select_lex;
res= new (thd->mem_root) Item_cond_or(thd);
if (!res)
@@ -109,7 +111,7 @@ static COND* make_cond(THD *thd, TABLE_LIST *tables, LEX_STRING *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);
Item_string *pattern= new (thd->mem_root) Item_string(thd, filter->str,
(uint) filter->length, cs);
diff --git a/sql/item.cc b/sql/item.cc
index 895a3d31b64..66b3ee46b38 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -70,11 +70,12 @@ bool cmp_items(Item *a, Item *b)
/**
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 &&
- thd->lex->in_sum_func->nest_level >= select->nest_level)
- set_if_bigger(thd->lex->in_sum_func->max_sum_func_level,
+ LEX *lex_s= select->parent_lex;
+ if (lex_s->in_sum_func &&
+ 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);
}
@@ -643,6 +644,7 @@ Item_ident::Item_ident(THD *thd, Name_resolution_context *context_arg,
cached_table(0), depended_from(0), can_be_depended(TRUE)
{
name= *field_name_arg;
+ DBUG_ASSERT(!context || context->select_lex);
}
@@ -659,6 +661,7 @@ Item_ident::Item_ident(THD *thd, TABLE_LIST *view_arg,
cached_table(NULL), depended_from(NULL), can_be_depended(TRUE)
{
name= *field_name_arg;
+ DBUG_ASSERT(!context || context->select_lex);
}
@@ -680,7 +683,9 @@ Item_ident::Item_ident(THD *thd, Item_ident *item)
cached_table(item->cached_table),
depended_from(item->depended_from),
can_be_depended(item->can_be_depended)
-{}
+{
+ DBUG_ASSERT(!context || context->select_lex);
+}
void Item_ident::cleanup()
{
@@ -5427,7 +5432,14 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
*/
Name_resolution_context *last_checked_context= context;
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;
SELECT_LEX *select= 0;
/* Currently derived tables cannot be correlated */
@@ -5529,18 +5541,18 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
return -1;
thd->change_item_tree(reference, rf);
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
the nest level of the enclosing set function : adjust the value of
max_arg_level for the function if it's needed.
*/
- if (thd->lex->in_sum_func &&
- thd->lex->in_sum_func->nest_level >= select->nest_level)
+ if (lex_s->in_sum_func &&
+ lex_s->in_sum_func->nest_level >= select->nest_level)
{
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);
set_field(*from_field);
fixed= 1;
@@ -5561,10 +5573,10 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
((ref_type == REF_ITEM || ref_type == FIELD_ITEM) ?
(Item_ident*) (*reference) :
0), false);
- if (thd->lex->in_sum_func &&
- thd->lex->in_sum_func->nest_level >= select->nest_level)
+ if (lex_s->in_sum_func &&
+ 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);
}
/*
@@ -5656,7 +5668,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,
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);
/*
@@ -5671,7 +5683,7 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
We can not "move" aggregate function in the place where
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,
context->select_lex, rf,
rf, false);
@@ -5684,7 +5696,7 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
We can not "move" aggregate function in the place where
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,
context->select_lex,
this, (Item_ident*)*reference, false);
@@ -5762,7 +5774,20 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
DBUG_ASSERT(fixed == 0);
Field *from_field= (Field *)not_found_field;
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)
{
@@ -5830,7 +5855,7 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
We can not "move" aggregate function in the place where
its arguments are not defined.
*/
- set_max_sum_func_level(thd, select);
+ set_max_sum_func_level(select);
set_field(new_field);
depended_from= (*((Item_field**)res))->depended_from;
return 0;
@@ -5858,7 +5883,7 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
We can not "move" aggregate function in the place where
its arguments are not defined.
*/
- set_max_sum_func_level(thd, select);
+ set_max_sum_func_level(select);
return FALSE;
}
}
@@ -5895,10 +5920,11 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
goto mark_non_agg_field;
}
- if (thd->lex->in_sum_func &&
- thd->lex->in_sum_func->nest_level ==
+ if (lex_s &&
+ lex_s->in_sum_func &&
+ 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);
/*
if it is not expression from merged VIEW we will set this field.
@@ -5964,8 +5990,9 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
if (field->vcol_info)
fix_session_vcol_expr_for_read(thd, field, field->vcol_info);
if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY &&
- !outer_fixed && !thd->lex->in_sum_func &&
+ !outer_fixed &&
select &&
+ !lex_s->in_sum_func &&
select->cur_pos_in_select_list != UNDEF_POS &&
select->join)
{
@@ -6000,13 +6027,13 @@ mark_non_agg_field:
*/
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);
else
{
if (outer_fixed)
- thd->lex->in_sum_func->outer_fields.push_back(this, thd->mem_root);
- else if (thd->lex->in_sum_func->nest_level !=
+ lex_s->in_sum_func->outer_fields.push_back(this, thd->mem_root);
+ else if (lex_s->in_sum_func->nest_level !=
select->nest_level)
select_lex->set_non_agg_field_used(true);
}
@@ -7465,6 +7492,12 @@ Item *get_field_item_for_having(THD *thd, Item *item, st_select_lex *sel)
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)
{
@@ -7484,12 +7517,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,
uchar *arg)
{
+ st_select_lex *sel= (st_select_lex *)arg;
+ context= &sel->context;
if ((*ref)->marker & SUBSTITUTION_FL)
{
this->marker|= SUBSTITUTION_FL;
return this;
}
- st_select_lex *sel= (st_select_lex *)arg;
table_map tab_map= sel->master_unit()->derived->table->map;
if ((item_equal && !(item_equal->used_tables() & tab_map)) ||
!item_equal)
@@ -7752,7 +7786,9 @@ bool Item_ref::fix_fields(THD *thd, Item **reference)
{
enum_parsing_place place= NO_MATTER;
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)
{
@@ -7913,10 +7949,10 @@ bool Item_ref::fix_fields(THD *thd, Item **reference)
the nest level of the enclosing set function : adjust the value of
max_arg_level for the function if it's needed.
*/
- if (thd->lex->in_sum_func &&
- thd->lex->in_sum_func->nest_level >=
+ if (lex_s->in_sum_func &&
+ lex_s->in_sum_func->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);
return FALSE;
}
@@ -7936,10 +7972,10 @@ bool Item_ref::fix_fields(THD *thd, Item **reference)
the nest level of the enclosing set function : adjust the value of
max_arg_level for the function if it's needed.
*/
- if (thd->lex->in_sum_func &&
- thd->lex->in_sum_func->nest_level >=
+ if (lex_s->in_sum_func &&
+ lex_s->in_sum_func->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);
}
}
diff --git a/sql/item.h b/sql/item.h
index 2270b8d7623..6b64e7788bc 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -3324,6 +3324,7 @@ public:
Collect outer references
*/
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,
const char *db_name,
const char *table_name, List_iterator<Item> *it,
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index 7a0c2b3a35c..82b40966e4f 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -5223,8 +5223,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->table= tmp_table;
- context= new Name_resolution_context;
+ context= new (thd->mem_root) Name_resolution_context;
context->init();
+ context->select_lex= item_in->unit->first_select();
context->first_name_resolution_table=
context->last_name_resolution_table= tmp_table_ref;
semi_join_conds_context= context;
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index 581c94bd191..a81cfd7ea82 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -72,6 +72,7 @@ size_t Item_sum::ram_limitation(THD *thd)
bool Item_sum::init_sum_func_check(THD *thd)
{
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())
{
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;
}
/* 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 */
- thd->lex->in_sum_func= this;
+ lex_s->in_sum_func= this;
nest_level= thd->lex->current_select->nest_level;
ref_by= 0;
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)
{
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);
allow_sum_func.intersect(curr_sel->name_visibility_map);
bool invalid= FALSE;
@@ -318,7 +320,7 @@ bool Item_sum::check_sum_func(THD *thd, Item **ref)
if (sum_func() == SP_AGGREGATE_FUNC)
aggr_sel->set_custom_agg_func_used(true);
update_used_tables();
- thd->lex->in_sum_func= in_sum_func;
+ lex_s->in_sum_func= in_sum_func;
return FALSE;
}
diff --git a/sql/mysql_upgrade_service.cc b/sql/mysql_upgrade_service.cc
index a10b5bb5162..cfff67dbfaf 100644
--- a/sql/mysql_upgrade_service.cc
+++ b/sql/mysql_upgrade_service.cc
@@ -271,7 +271,7 @@ void stop_mysqld_service()
}
/*
- Remeber initial state of the service, we will restore it on
+ Remember initial state of the service, we will restore it on
exit.
*/
if(initial_service_state == UINT_MAX)
@@ -492,8 +492,10 @@ int main(int argc, char **argv)
CopyFile(service_properties.inifile, my_ini_bck, FALSE);
upgrade_config_file(service_properties.inifile);
- log("Phase %d/%d: Ensuring innodb slow shutdown%s", ++phase, max_phases,
- old_mysqld_exe_exists?",this can take some time":"(skipped)");
+ bool do_start_stop_server = old_mysqld_exe_exists && initial_service_state != SERVICE_RUNNING;
+
+ log("Phase %d/%d: Start and stop server in the old version, to avoid crash recovery %s", ++phase, max_phases,
+ do_start_stop_server?",this can take some time":"(skipped)");
char socket_param[FN_REFLEN];
sprintf_s(socket_param, "--socket=mysql_upgrade_service_%u",
@@ -501,11 +503,11 @@ int main(int argc, char **argv)
DWORD start_duration_ms = 0;
- if (old_mysqld_exe_exists)
+ if (do_start_stop_server)
{
- /* Start/stop server with --loose-innodb-fast-shutdown=0 */
+ /* Start/stop server with --loose-innodb-fast-shutdown=1 */
mysqld_process = (HANDLE)run_tool(P_NOWAIT, service_properties.mysqld_exe,
- defaults_file_param, "--loose-innodb-fast-shutdown=0", "--skip-networking",
+ defaults_file_param, "--loose-innodb-fast-shutdown=1", "--skip-networking",
"--enable-named-pipe", socket_param, "--skip-slave-start", NULL);
if (mysqld_process == INVALID_HANDLE_VALUE)
diff --git a/sql/sp.cc b/sql/sp.cc
index de1a8a04756..b566d41c857 100644
--- a/sql/sp.cc
+++ b/sql/sp.cc
@@ -1891,8 +1891,6 @@ bool
Sp_handler::sp_show_create_routine(THD *thd,
const Database_qualified_name *name) const
{
- sp_head *sp;
-
DBUG_ENTER("sp_show_create_routine");
DBUG_PRINT("enter", ("type: %s name: %.*s",
type_str(),
@@ -1905,20 +1903,20 @@ Sp_handler::sp_show_create_routine(THD *thd,
It is "safe" to do as long as it doesn't affect the results
of the binary log or the query cache, which currently it does not.
*/
- if (sp_cache_routine(thd, name, false, &sp))
- DBUG_RETURN(TRUE);
-
- if (sp == NULL || sp->show_create_routine(thd, this))
+ sp_head *sp= 0;
+ bool free_sp= db_find_routine(thd, name, &sp) == SP_OK;
+ bool ret= !sp || sp->show_create_routine(thd, this);
+ if (ret)
{
/*
If we have insufficient privileges, pretend the routine
does not exist.
*/
my_error(ER_SP_DOES_NOT_EXIST, MYF(0), type_str(), name->m_name.str);
- DBUG_RETURN(TRUE);
}
-
- DBUG_RETURN(FALSE);
+ if (free_sp)
+ sp_head::destroy(sp);
+ DBUG_RETURN(ret);
}
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index e0a70ff023a..88cb16e3e7d 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -6907,6 +6907,7 @@ set_new_item_local_context(THD *thd, Item_ident *item, TABLE_LIST *table_ref)
if (!(context= new (thd->mem_root) Name_resolution_context))
return TRUE;
context->init();
+ context->select_lex= table_ref->select_lex;
context->first_name_resolution_table=
context->last_name_resolution_table= table_ref;
item->context= context;
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index 06e7921c90d..980e37a7686 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -3046,6 +3046,7 @@ void reinit_stmt_before_use(THD *thd, LEX *lex)
}
for (; sl; sl= sl->next_select_in_list())
{
+ sl->parent_lex->in_sum_func= NULL;
if (sl->changed_elements & TOUCHED_SEL_COND)
{
/* remove option which was put by mysql_explain_union() */
@@ -3180,7 +3181,6 @@ void reinit_stmt_before_use(THD *thd, LEX *lex)
lex->result->set_thd(thd);
}
lex->allow_sum_func.clear_all();
- lex->in_sum_func= NULL;
DBUG_VOID_RETURN;
}