mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-5535: Cannot reopen temporary table
Add generic temporary table related tests.
This commit is contained in:
@ -311,3 +311,184 @@ show status like 'com_drop%table';
|
||||
Variable_name Value
|
||||
Com_drop_table 2
|
||||
Com_drop_temporary_table 1
|
||||
#
|
||||
# Some more generic temporary table tests
|
||||
# added during MDEV-5535.
|
||||
#
|
||||
DROP DATABASE IF EXISTS temp_db;
|
||||
CREATE DATABASE temp_db;
|
||||
USE temp_db;
|
||||
#
|
||||
# SHOW TABLES do not list temporary tables.
|
||||
#
|
||||
CREATE TEMPORARY TABLE temp_t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO temp_t1 VALUES(1);
|
||||
SELECT * FROM temp_t1;
|
||||
i
|
||||
1
|
||||
SHOW TABLES;
|
||||
Tables_in_temp_db
|
||||
DROP TABLE temp_t1;
|
||||
#
|
||||
# Create and drop a temporary table.
|
||||
#
|
||||
CREATE TEMPORARY TABLE temp_t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO temp_t1 VALUES(1);
|
||||
SELECT * FROM temp_t1;
|
||||
i
|
||||
1
|
||||
DROP TABLE temp_t1;
|
||||
SELECT * FROM temp_t1;
|
||||
ERROR 42S02: Table 'temp_db.temp_t1' doesn't exist
|
||||
#
|
||||
# Create a temporary table and base table with same name and DROP TABLE.
|
||||
#
|
||||
CREATE TABLE t1(c1 VARCHAR(20)) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES("BASE TABLE");
|
||||
CREATE TEMPORARY TABLE t1(c1 VARCHAR(20)) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES("TEMPORARY TABLE");
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
TEMPORARY TABLE
|
||||
DROP TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
BASE TABLE
|
||||
DROP TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
ERROR 42S02: Table 'temp_db.t1' doesn't exist
|
||||
#
|
||||
# Create a temporary table and base table with same name and DROP TEMPORARY
|
||||
# TABLE.
|
||||
#
|
||||
CREATE TABLE t1(c1 VARCHAR(20)) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES("BASE TABLE");
|
||||
CREATE TEMPORARY TABLE t1(c1 VARCHAR(20)) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES("TEMPORARY TABLE");
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
TEMPORARY TABLE
|
||||
DROP TEMPORARY TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
BASE TABLE
|
||||
DROP TEMPORARY TABLE t1;
|
||||
ERROR 42S02: Unknown table 'temp_db.t1'
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
BASE TABLE
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Create a temporary table and drop its parent database.
|
||||
#
|
||||
USE temp_db;
|
||||
CREATE TEMPORARY TABLE temp_t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO temp_t1 VALUES (1);
|
||||
DROP DATABASE temp_db;
|
||||
CREATE DATABASE temp_db;
|
||||
USE temp_db;
|
||||
DROP TEMPORARY TABLE temp_t1;
|
||||
#
|
||||
# Similar to above, but this time with a base table with same name.
|
||||
#
|
||||
USE temp_db;
|
||||
CREATE TABLE t1(i INT)ENGINE=INNODB;
|
||||
CREATE TEMPORARY TABLE t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
DROP DATABASE temp_db;
|
||||
CREATE DATABASE temp_db;
|
||||
USE temp_db;
|
||||
DROP TEMPORARY TABLE t1;
|
||||
DROP TABLE t1;
|
||||
ERROR 42S02: Unknown table 'temp_db.t1'
|
||||
#
|
||||
# Create a temporary table within a function.
|
||||
#
|
||||
USE temp_db;
|
||||
CREATE FUNCTION f1() RETURNS INT
|
||||
BEGIN
|
||||
DROP TEMPORARY TABLE IF EXISTS temp_t1;
|
||||
CREATE TEMPORARY TABLE temp_t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO `temp_t1` VALUES(1);
|
||||
RETURN (SELECT COUNT(*) FROM temp_t1);
|
||||
END|
|
||||
SELECT f1();
|
||||
f1()
|
||||
1
|
||||
SELECT * FROM temp_t1;
|
||||
i
|
||||
1
|
||||
DROP TABLE temp_t1;
|
||||
CREATE TEMPORARY TABLE `temp_t1`(i INT) ENGINE=INNODB;
|
||||
SELECT f1();
|
||||
f1()
|
||||
1
|
||||
SELECT * FROM temp_t1;
|
||||
i
|
||||
1
|
||||
DROP FUNCTION f1;
|
||||
#
|
||||
# Create and drop a temporary table within a function.
|
||||
#
|
||||
CREATE FUNCTION f2() RETURNS INT
|
||||
BEGIN
|
||||
DROP TEMPORARY TABLE IF EXISTS temp_t1;
|
||||
CREATE TEMPORARY TABLE temp_t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO temp_t1 VALUES(1);
|
||||
DROP TABLE temp_t1;
|
||||
RETURN 0;
|
||||
END|
|
||||
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
|
||||
CREATE FUNCTION f2() RETURNS INT
|
||||
BEGIN
|
||||
DROP TEMPORARY TABLE IF EXISTS temp_t1;
|
||||
CREATE TEMPORARY TABLE temp_t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO temp_t1 VALUES(1);
|
||||
DROP TEMPORARY TABLE temp_t1;
|
||||
RETURN 0;
|
||||
END|
|
||||
SELECT f2();
|
||||
f2()
|
||||
0
|
||||
DROP FUNCTION f2;
|
||||
#
|
||||
# Create a temporary table within a function and select it from another
|
||||
# function.
|
||||
#
|
||||
CREATE FUNCTION f2() RETURNS INT
|
||||
BEGIN
|
||||
DROP TEMPORARY TABLE IF EXISTS temp_t1;
|
||||
CREATE TEMPORARY TABLE temp_t1 (i INT) ENGINE=INNODB;
|
||||
INSERT INTO temp_t1 VALUES (1);
|
||||
RETURN f2_1();
|
||||
END|
|
||||
CREATE FUNCTION f2_1() RETURNS INT
|
||||
RETURN (SELECT COUNT(*) FROM temp_t1)|
|
||||
SELECT f2();
|
||||
f2()
|
||||
1
|
||||
DROP TEMPORARY TABLE temp_t1;
|
||||
DROP FUNCTION f2;
|
||||
#
|
||||
# Create temporary table like base table.
|
||||
#
|
||||
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
CREATE TEMPORARY TABLE temp_t1 LIKE t1;
|
||||
SELECT * FROM temp_t1;
|
||||
i
|
||||
CREATE TEMPORARY TABLE t1 LIKE t1;
|
||||
ERROR 42000: Not unique table/alias: 't1'
|
||||
DROP TABLE temp_t1, t1;
|
||||
#
|
||||
# Create temporary table as base table.
|
||||
#
|
||||
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
CREATE TEMPORARY TABLE temp_t1 AS SELECT * FROM t1;
|
||||
SELECT * FROM temp_t1;
|
||||
i
|
||||
1
|
||||
DROP TABLE temp_t1, t1;
|
||||
# Cleanup
|
||||
DROP DATABASE temp_db;
|
||||
|
@ -1,5 +1,6 @@
|
||||
# mysqltest should be fixed
|
||||
--source include/not_embedded.inc
|
||||
--source include/have_innodb.inc
|
||||
|
||||
#
|
||||
# Test of temporary tables
|
||||
@ -338,3 +339,202 @@ drop table t2;
|
||||
drop temporary table t3;
|
||||
show status like 'com_create%table';
|
||||
show status like 'com_drop%table';
|
||||
|
||||
--echo #
|
||||
--echo # Some more generic temporary table tests
|
||||
--echo # added during MDEV-5535.
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP DATABASE IF EXISTS temp_db;
|
||||
--enable_warnings
|
||||
|
||||
CREATE DATABASE temp_db;
|
||||
USE temp_db;
|
||||
|
||||
--echo #
|
||||
--echo # SHOW TABLES do not list temporary tables.
|
||||
--echo #
|
||||
|
||||
CREATE TEMPORARY TABLE temp_t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO temp_t1 VALUES(1);
|
||||
SELECT * FROM temp_t1;
|
||||
SHOW TABLES;
|
||||
DROP TABLE temp_t1;
|
||||
|
||||
--echo #
|
||||
--echo # Create and drop a temporary table.
|
||||
--echo #
|
||||
|
||||
CREATE TEMPORARY TABLE temp_t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO temp_t1 VALUES(1);
|
||||
SELECT * FROM temp_t1;
|
||||
DROP TABLE temp_t1;
|
||||
--error ER_NO_SUCH_TABLE
|
||||
SELECT * FROM temp_t1;
|
||||
|
||||
--echo #
|
||||
--echo # Create a temporary table and base table with same name and DROP TABLE.
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(c1 VARCHAR(20)) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES("BASE TABLE");
|
||||
# Temporary table shadows the base table with the same name.
|
||||
CREATE TEMPORARY TABLE t1(c1 VARCHAR(20)) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES("TEMPORARY TABLE");
|
||||
SELECT * FROM t1;
|
||||
# Only temporary table should get dropped.
|
||||
DROP TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
--error ER_NO_SUCH_TABLE
|
||||
SELECT * FROM t1;
|
||||
|
||||
--echo #
|
||||
--echo # Create a temporary table and base table with same name and DROP TEMPORARY
|
||||
--echo # TABLE.
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(c1 VARCHAR(20)) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES("BASE TABLE");
|
||||
# Temporary table shadows the base table with the same name.
|
||||
CREATE TEMPORARY TABLE t1(c1 VARCHAR(20)) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES("TEMPORARY TABLE");
|
||||
SELECT * FROM t1;
|
||||
# Only temporary table should get dropped.
|
||||
DROP TEMPORARY TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
DROP TEMPORARY TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Create a temporary table and drop its parent database.
|
||||
--echo #
|
||||
|
||||
USE temp_db;
|
||||
CREATE TEMPORARY TABLE temp_t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO temp_t1 VALUES (1);
|
||||
# Drop database
|
||||
DROP DATABASE temp_db;
|
||||
CREATE DATABASE temp_db;
|
||||
USE temp_db;
|
||||
# Temporary tables are not physically tied to schemas
|
||||
DROP TEMPORARY TABLE temp_t1;
|
||||
|
||||
--echo #
|
||||
--echo # Similar to above, but this time with a base table with same name.
|
||||
--echo #
|
||||
|
||||
USE temp_db;
|
||||
CREATE TABLE t1(i INT)ENGINE=INNODB;
|
||||
CREATE TEMPORARY TABLE t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
# Drop database
|
||||
DROP DATABASE temp_db;
|
||||
CREATE DATABASE temp_db;
|
||||
USE temp_db;
|
||||
# Temporary tables are not physically tied to schemas
|
||||
DROP TEMPORARY TABLE t1;
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Create a temporary table within a function.
|
||||
--echo #
|
||||
|
||||
USE temp_db;
|
||||
delimiter |;
|
||||
CREATE FUNCTION f1() RETURNS INT
|
||||
BEGIN
|
||||
DROP TEMPORARY TABLE IF EXISTS temp_t1;
|
||||
CREATE TEMPORARY TABLE temp_t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO `temp_t1` VALUES(1);
|
||||
RETURN (SELECT COUNT(*) FROM temp_t1);
|
||||
END|
|
||||
delimiter ;|
|
||||
|
||||
SELECT f1();
|
||||
SELECT * FROM temp_t1;
|
||||
|
||||
DROP TABLE temp_t1;
|
||||
CREATE TEMPORARY TABLE `temp_t1`(i INT) ENGINE=INNODB;
|
||||
SELECT f1();
|
||||
SELECT * FROM temp_t1;
|
||||
DROP FUNCTION f1;
|
||||
|
||||
--echo #
|
||||
--echo # Create and drop a temporary table within a function.
|
||||
--echo #
|
||||
|
||||
delimiter |;
|
||||
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
|
||||
CREATE FUNCTION f2() RETURNS INT
|
||||
BEGIN
|
||||
DROP TEMPORARY TABLE IF EXISTS temp_t1;
|
||||
CREATE TEMPORARY TABLE temp_t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO temp_t1 VALUES(1);
|
||||
DROP TABLE temp_t1;
|
||||
RETURN 0;
|
||||
END|
|
||||
|
||||
CREATE FUNCTION f2() RETURNS INT
|
||||
BEGIN
|
||||
DROP TEMPORARY TABLE IF EXISTS temp_t1;
|
||||
CREATE TEMPORARY TABLE temp_t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO temp_t1 VALUES(1);
|
||||
DROP TEMPORARY TABLE temp_t1;
|
||||
RETURN 0;
|
||||
END|
|
||||
delimiter ;|
|
||||
SELECT f2();
|
||||
DROP FUNCTION f2;
|
||||
|
||||
--echo #
|
||||
--echo # Create a temporary table within a function and select it from another
|
||||
--echo # function.
|
||||
--echo #
|
||||
|
||||
delimiter |;
|
||||
CREATE FUNCTION f2() RETURNS INT
|
||||
BEGIN
|
||||
DROP TEMPORARY TABLE IF EXISTS temp_t1;
|
||||
CREATE TEMPORARY TABLE temp_t1 (i INT) ENGINE=INNODB;
|
||||
INSERT INTO temp_t1 VALUES (1);
|
||||
RETURN f2_1();
|
||||
END|
|
||||
|
||||
CREATE FUNCTION f2_1() RETURNS INT
|
||||
RETURN (SELECT COUNT(*) FROM temp_t1)|
|
||||
delimiter ;|
|
||||
|
||||
SELECT f2();
|
||||
DROP TEMPORARY TABLE temp_t1;
|
||||
DROP FUNCTION f2;
|
||||
|
||||
--echo #
|
||||
--echo # Create temporary table like base table.
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
CREATE TEMPORARY TABLE temp_t1 LIKE t1;
|
||||
SELECT * FROM temp_t1;
|
||||
--error ER_NONUNIQ_TABLE
|
||||
CREATE TEMPORARY TABLE t1 LIKE t1;
|
||||
DROP TABLE temp_t1, t1;
|
||||
|
||||
--echo #
|
||||
--echo # Create temporary table as base table.
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
CREATE TEMPORARY TABLE temp_t1 AS SELECT * FROM t1;
|
||||
SELECT * FROM temp_t1;
|
||||
DROP TABLE temp_t1, t1;
|
||||
|
||||
--echo # Cleanup
|
||||
DROP DATABASE temp_db;
|
||||
|
||||
|
Reference in New Issue
Block a user