Commit a10b63bf authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.3 into 10.4

parents 05abcd7e f3bc4f49
...@@ -224,10 +224,10 @@ SELECT 4; ...@@ -224,10 +224,10 @@ SELECT 4;
END IF ; END IF ;
END"where name = "P1"; END"where name = "P1";
show create procedure 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; show warnings;
Level Code Message Level Code Message
Error 1327 Undeclared variable: foo 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; drop procedure P1;
# End of 10.4 tests # End of 10.4 tests
...@@ -275,7 +275,7 @@ SELECT 4; ...@@ -275,7 +275,7 @@ SELECT 4;
END IF ; END IF ;
END"where name = "P1"; END"where name = "P1";
--error ER_SP_PROC_TABLE_CORRUPT --error ER_SP_UNDECLARED_VAR
show create procedure P1; show create procedure P1;
show warnings; show warnings;
......
...@@ -168,7 +168,7 @@ RETURN 0; ...@@ -168,7 +168,7 @@ RETURN 0;
END latin1 latin1_swedish_ci latin1_swedish_ci END latin1 latin1_swedish_ci latin1_swedish_ci
SHOW CREATE FUNCTION TESTF_bug11763507; SHOW CREATE FUNCTION TESTF_bug11763507;
Function sql_mode Create Function character_set_client collation_connection Database Collation 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 BEGIN
RETURN 0; RETURN 0;
END latin1 latin1_swedish_ci latin1_swedish_ci END latin1 latin1_swedish_ci latin1_swedish_ci
...@@ -198,7 +198,7 @@ SELECT "PROCEDURE testp_bug11763507"; ...@@ -198,7 +198,7 @@ SELECT "PROCEDURE testp_bug11763507";
END latin1 latin1_swedish_ci latin1_swedish_ci END latin1 latin1_swedish_ci latin1_swedish_ci
SHOW CREATE PROCEDURE TESTP_bug11763507; SHOW CREATE PROCEDURE TESTP_bug11763507;
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation 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 BEGIN
SELECT "PROCEDURE testp_bug11763507"; SELECT "PROCEDURE testp_bug11763507";
END latin1 latin1_swedish_ci latin1_swedish_ci END latin1 latin1_swedish_ci latin1_swedish_ci
......
...@@ -703,9 +703,6 @@ connection default; ...@@ -703,9 +703,6 @@ connection default;
# #
# SHOW CREATE PROCEDURE p1 called from p1, after p1 was altered # 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() CREATE PROCEDURE p1()
BEGIN BEGIN
SELECT get_lock("test", 10); SELECT get_lock("test", 10);
...@@ -736,10 +733,7 @@ get_lock("test", 10) ...@@ -736,10 +733,7 @@ get_lock("test", 10)
1 1
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation 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`() p1 STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`()
BEGIN BEGIN END latin1 latin1_swedish_ci latin1_swedish_ci
SELECT get_lock("test", 10);
SHOW CREATE PROCEDURE p1;
END latin1 latin1_swedish_ci latin1_swedish_ci
connection con3; connection con3;
disconnect con3; disconnect con3;
connection con2; connection con2;
......
...@@ -807,9 +807,6 @@ connection default; ...@@ -807,9 +807,6 @@ connection default;
--echo # --echo #
--echo # SHOW CREATE PROCEDURE p1 called from p1, after p1 was altered --echo # SHOW CREATE PROCEDURE p1 called from p1, after p1 was altered
--echo # --echo #
--echo # We are just covering the existing behaviour with tests. The
--echo # results are not necessarily correct."
--echo #
delimiter |; delimiter |;
CREATE PROCEDURE p1() CREATE PROCEDURE p1()
......
...@@ -8874,6 +8874,28 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp ...@@ -8874,6 +8874,28 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
BEGIN BEGIN
RETURN ''; RETURN '';
END' at line 2 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 # End of 10.3 tests
# #
# Start of 10.4 tests # Start of 10.4 tests
......
...@@ -10418,6 +10418,23 @@ END; ...@@ -10418,6 +10418,23 @@ END;
$$ $$
DELIMITER ;$$ 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 --echo # End of 10.3 tests
......
...@@ -6789,6 +6789,49 @@ sum(z) ...@@ -6789,6 +6789,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
# #
# #
......
...@@ -6500,6 +6500,55 @@ SELECT sum(z) FROM v1; ...@@ -6500,6 +6500,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 #
......
...@@ -727,6 +727,10 @@ END ...@@ -727,6 +727,10 @@ END
character_set_client latin1 character_set_client latin1
collation_connection latin1_swedish_ci collation_connection latin1_swedish_ci
Database Collation 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; SHOW CREATE PACKAGE BODY test2;
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 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 ...@@ -747,6 +751,10 @@ END
character_set_client latin1 character_set_client latin1
collation_connection latin1_swedish_ci collation_connection latin1_swedish_ci
Database Collation 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; DROP PACKAGE BODY test2;
SELECT test2.f1(); SELECT test2.f1();
ERROR 42000: FUNCTION test.test2.f1 does not exist ERROR 42000: FUNCTION test.test2.f1 does not exist
......
...@@ -36,31 +36,3 @@ COUNT(f1) = 1000 ...@@ -36,31 +36,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;
--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; ...@@ -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;
...@@ -8,77 +8,65 @@ SET GLOBAL innodb_defragment_stats_accuracy = 20; ...@@ -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;
--echo # Persistent stats recorded. 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_page_split'); FROM seq_1025_to_1433;
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 @@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'); let $wait_timeout=30;
select count(stat_value) = 0 from mysql.innodb_index_stats where table_name like '%t1%' and stat_name in ('n_pages_freed'); let $wait_condition = SELECT COUNT(*)>0 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'); --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; ...@@ -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;
...@@ -50,7 +50,7 @@ let $trx_after= `select substr('$trx_after',9)`; ...@@ -50,7 +50,7 @@ let $trx_after= `select substr('$trx_after',9)`;
drop table t1, t2; 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;
} }
...@@ -24,3 +24,19 @@ VARIABLE_VALUE>0 VARIABLE_NAME ...@@ -24,3 +24,19 @@ VARIABLE_VALUE>0 VARIABLE_NAME
1 Collation used utf8mb4_bin 1 Collation used utf8mb4_bin
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_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;
...@@ -42,3 +42,10 @@ if (`SELECT VERSION() LIKE '%embedded%'`) ...@@ -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;
...@@ -92,16 +92,18 @@ static COND * const OOM= (COND*)1; ...@@ -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) ...@@ -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);
......
This diff is collapsed.
...@@ -3324,6 +3324,7 @@ class Item_ident :public Item_result_field ...@@ -3324,6 +3324,7 @@ class Item_ident :public Item_result_field
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,
......
...@@ -5223,8 +5223,9 @@ bool subselect_hash_sj_engine::make_semi_join_conds() ...@@ -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->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;
......
...@@ -72,6 +72,7 @@ size_t Item_sum::ram_limitation(THD *thd) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
...@@ -271,7 +271,7 @@ void stop_mysqld_service() ...@@ -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. exit.
*/ */
if(initial_service_state == UINT_MAX) if(initial_service_state == UINT_MAX)
...@@ -492,8 +492,10 @@ int main(int argc, char **argv) ...@@ -492,8 +492,10 @@ int main(int argc, char **argv)
CopyFile(service_properties.inifile, my_ini_bck, FALSE); CopyFile(service_properties.inifile, my_ini_bck, FALSE);
upgrade_config_file(service_properties.inifile); upgrade_config_file(service_properties.inifile);
log("Phase %d/%d: Ensuring innodb slow shutdown%s", ++phase, max_phases, bool do_start_stop_server = old_mysqld_exe_exists && initial_service_state != SERVICE_RUNNING;
old_mysqld_exe_exists?",this can take some time":"(skipped)");
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]; char socket_param[FN_REFLEN];
sprintf_s(socket_param, "--socket=mysql_upgrade_service_%u", sprintf_s(socket_param, "--socket=mysql_upgrade_service_%u",
...@@ -501,11 +503,11 @@ int main(int argc, char **argv) ...@@ -501,11 +503,11 @@ int main(int argc, char **argv)
DWORD start_duration_ms = 0; 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, 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); "--enable-named-pipe", socket_param, "--skip-slave-start", NULL);
if (mysqld_process == INVALID_HANDLE_VALUE) if (mysqld_process == INVALID_HANDLE_VALUE)
......
...@@ -1891,8 +1891,6 @@ bool ...@@ -1891,8 +1891,6 @@ bool
Sp_handler::sp_show_create_routine(THD *thd, Sp_handler::sp_show_create_routine(THD *thd,
const Database_qualified_name *name) const const Database_qualified_name *name) const
{ {
sp_head *sp;
DBUG_ENTER("sp_show_create_routine"); DBUG_ENTER("sp_show_create_routine");
DBUG_PRINT("enter", ("type: %s name: %.*s", DBUG_PRINT("enter", ("type: %s name: %.*s",
type_str(), type_str(),
...@@ -1905,20 +1903,20 @@ Sp_handler::sp_show_create_routine(THD *thd, ...@@ -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 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. of the binary log or the query cache, which currently it does not.
*/ */
if (sp_cache_routine(thd, name, false, &sp)) sp_head *sp= 0;
DBUG_RETURN(TRUE); bool free_sp= db_find_routine(thd, name, &sp) == SP_OK;
bool ret= !sp || sp->show_create_routine(thd, this);
if (sp == NULL || sp->show_create_routine(thd, this)) if (ret)
{ {
/* /*
If we have insufficient privileges, pretend the routine If we have insufficient privileges, pretend the routine
does not exist. does not exist.
*/ */
my_error(ER_SP_DOES_NOT_EXIST, MYF(0), type_str(), name->m_name.str); my_error(ER_SP_DOES_NOT_EXIST, MYF(0), type_str(), name->m_name.str);
DBUG_RETURN(TRUE);
} }
if (free_sp)
DBUG_RETURN(FALSE); sp_head::destroy(sp);
DBUG_RETURN(ret);
} }
......
...@@ -6907,6 +6907,7 @@ set_new_item_local_context(THD *thd, Item_ident *item, TABLE_LIST *table_ref) ...@@ -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)) 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;
......
...@@ -3046,6 +3046,7 @@ void reinit_stmt_before_use(THD *thd, LEX *lex) ...@@ -3046,6 +3046,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() */
...@@ -3180,7 +3181,6 @@ void reinit_stmt_before_use(THD *thd, LEX *lex) ...@@ -3180,7 +3181,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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment