mariadb/mysql-test/main/temp_table.test

697 lines
16 KiB
Text

# mysqltest should be fixed
--source include/not_embedded.inc
--source include/have_innodb.inc
#
# Test of temporary tables
#
--echo #
--echo # test basic creation of temporary tables together with normal table
--echo #
create table t1 (a int);
create temporary table t1 AS SELECT 1;
--error 1050
create temporary table t1 AS SELECT 1;
--error 1050
create temporary table t1 (a int);
drop temporary table t1;
drop table t1;
create temporary table t1 AS SELECT 1;
--error 1050
create temporary table t1 AS SELECT 1;
--error 1050
create temporary table t1 (a int);
drop temporary table t1;
--echo #
--echo # Test with rename
--echo #
CREATE TABLE t1 (c int not null, d char (10) not null);
insert into t1 values(1,""),(2,"a"),(3,"b");
CREATE TEMPORARY TABLE t1 (a int not null, b char (10) not null);
insert into t1 values(4,"e"),(5,"f"),(6,"g");
alter table t1 rename t2;
select * from t1;
select * from t2;
CREATE TABLE t2 (x int not null, y int not null);
alter table t2 rename t1;
select * from t1;
create TEMPORARY TABLE t2 engine=heap select * from t1;
create TEMPORARY TABLE IF NOT EXISTS t2 (a int) engine=heap;
# This should give errors
--error 1050
CREATE TEMPORARY TABLE t1 (a int not null, b char (10) not null);
--error 1050
ALTER TABLE t1 RENAME t2;
select * from t2;
alter table t2 add primary key (a,b);
drop table t1,t2;
select * from t1;
drop table t2;
create temporary table t1 select *,2 as "e" from t1;
select * from t1;
drop table t1;
drop table t1;
#
# Test CONCAT_WS with temporary tables
#
CREATE TABLE t1 (pkCrash INTEGER PRIMARY KEY,strCrash VARCHAR(255));
INSERT INTO t1 ( pkCrash, strCrash ) VALUES ( 1, '1');
SELECT CONCAT_WS(pkCrash, strCrash) FROM t1;
drop table t1;
create temporary table t1 select 1 as 'x';
drop table t1;
CREATE TABLE t1 (x INT);
INSERT INTO t1 VALUES (1), (2), (3);
CREATE TEMPORARY TABLE tmp SELECT *, NULL FROM t1;
drop table t1;
#
# Problem with ELT
#
create temporary table t1 (id int(10) not null unique);
create temporary table t2 (id int(10) not null primary key,
val int(10) not null);
# put in some initial values
insert into t1 values (1),(2),(4);
insert into t2 values (1,1),(2,1),(3,1),(4,2);
# do a query using ELT, a join and an ORDER BY.
select one.id, two.val, elt(two.val,'one','two') from t1 one, t2 two where two.id=one.id order by one.id;
drop table t1,t2;
#
# Test of failed ALTER TABLE on temporary table
#
create temporary table t1 (a int not null);
insert into t1 values (1),(1);
-- error ER_DUP_ENTRY
alter table t1 add primary key (a);
drop table t1;
#
# In MySQL 4.0.4 doing a GROUP BY on a NULL column created a disk based
# temporary table when a memory based one would be good enough.
CREATE TABLE t1 (
d datetime default NULL
) ENGINE=MyISAM;
INSERT INTO t1 VALUES ('2002-10-24 14:50:32'),('2002-10-24 14:50:33'),('2002-10-24 14:50:34'),('2002-10-24 14:50:34'),('2002-10-24 14:50:34'),('2002-10-24 14:50:35'),('2002-10-24 14:50:35'),('2002-10-24 14:50:35'),('2002-10-24 14:50:35'),('2002-10-24 14:50:36'),('2002-10-24 14:50:36'),('2002-10-24 14:50:36'),('2002-10-24 14:50:36'),('2002-10-24 14:50:37'),('2002-10-24 14:50:37'),('2002-10-24 14:50:37'),('2002-10-24 14:50:37'),('2002-10-24 14:50:38'),('2002-10-24 14:50:38'),('2002-10-24 14:50:38'),('2002-10-24 14:50:39'),('2002-10-24 14:50:39'),('2002-10-24 14:50:39'),('2002-10-24 14:50:39'),('2002-10-24 14:50:40'),('2002-10-24 14:50:40'),('2002-10-24 14:50:40');
flush status;
--disable_ps_protocol
select * from t1 group by d;
show status like "created_tmp%tables";
--enable_ps_protocol
drop table t1;
# Fix for BUG#8921: Check that temporary table is ingored by view commands.
create temporary table v1 as select 'This is temp. table' A;
create view v1 as select 'This is view' A;
select * from v1;
show create table v1;
show create view v1;
drop view v1;
select * from v1;
create view v1 as select 'This is view again' A;
select * from v1;
drop table v1;
select * from v1;
drop view v1;
# Bug #8497: tmpdir with extra slashes would cause failures
#
create table t1 (a int, b int, index(a), index(b));
create table t2 (c int auto_increment, d varchar(255), primary key (c));
insert into t1 values (3,1),(3,2);
insert into t2 values (NULL, 'foo'), (NULL, 'bar');
select d, c from t1 left join t2 on b = c where a = 3 order by d;
drop table t1, t2;
#
# BUG#21096: locking issue ; temporary table conflicts.
#
# The problem was that on DROP TEMPORARY table name lock was acquired,
# which should not be done.
#
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
CREATE TABLE t1 (i INT);
LOCK TABLE t1 WRITE;
connect (conn1, localhost, root,,);
CREATE TEMPORARY TABLE t1 (i INT);
--echo The following command should not block
DROP TEMPORARY TABLE t1;
disconnect conn1;
connection default;
DROP TABLE t1;
#
# Check that it's not possible to drop a base table with
# DROP TEMPORARY statement.
#
CREATE TABLE t1 (i INT);
CREATE TEMPORARY TABLE t2 (i INT);
--error 1051
DROP TEMPORARY TABLE t2, t1;
# Table t2 should have been dropped.
--error 1146
SELECT * FROM t2;
# But table t1 should still be there.
SELECT * FROM t1;
DROP TABLE t1;
--echo End of 4.1 tests.
#
# Bug #24791: Union with AVG-groups generates wrong results
#
CREATE TABLE t1 ( c FLOAT( 20, 14 ) );
INSERT INTO t1 VALUES( 12139 );
CREATE TABLE t2 ( c FLOAT(30,18) );
INSERT INTO t2 VALUES( 123456 );
SELECT AVG( c ) FROM t1 UNION SELECT 1;
SELECT 1 UNION SELECT AVG( c ) FROM t1;
SELECT 1 UNION SELECT * FROM t2 UNION SELECT 1;
SELECT c/1 FROM t1 UNION SELECT 1;
DROP TABLE t1, t2;
#
# Test truncate with temporary tables
#
create temporary table t1 (a int);
insert into t1 values (4711);
select * from t1;
truncate t1;
insert into t1 values (42);
select * from t1;
drop table t1;
#
# Bug #35392: Delete all statement does not execute properly after
# few delete statements
#
CREATE TEMPORARY TABLE t1(a INT, b VARCHAR(20));
INSERT INTO t1 VALUES(1, 'val1'), (2, 'val2'), (3, 'val3');
DELETE FROM t1 WHERE a=1;
SELECT count(*) FROM t1;
DELETE FROM t1;
SELECT * FROM t1;
DROP TABLE t1;
#
# Bug#41348: INSERT INTO tbl SELECT * FROM temp_tbl overwrites locking type of temp table
#
--disable_warnings
DROP TABLE IF EXISTS t1,t2;
DROP FUNCTION IF EXISTS f1;
--enable_warnings
CREATE TEMPORARY TABLE t1 (a INT);
CREATE TEMPORARY TABLE t2 LIKE t1;
DELIMITER |;
CREATE FUNCTION f1() RETURNS INT
BEGIN
return 1;
END|
DELIMITER ;|
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT f1();
CREATE TABLE t3 SELECT * FROM t1;
INSERT INTO t1 SELECT f1();
UPDATE t1,t2 SET t1.a = t2.a;
INSERT INTO t2 SELECT f1();
DROP TABLE t1,t2,t3;
DROP FUNCTION f1;
--echo #
--echo # Bug #48067: A temp table with the same name as an existing table,
--echo # makes drop database fail.
--echo #
--disable_warnings
DROP TEMPORARY TABLE IF EXISTS bug48067.t1;
DROP DATABASE IF EXISTS bug48067;
--enable_warnings
CREATE DATABASE bug48067;
CREATE TABLE bug48067.t1 (c1 int);
INSERT INTO bug48067.t1 values (1);
CREATE TEMPORARY TABLE bug48067.t1 (c1 int);
DROP DATABASE bug48067;
DROP TEMPORARY table bug48067.t1;
--echo End of 5.1 tests
--echo #
--echo # Test that admin statements work for temporary tables.
--echo #
--disable_warnings
DROP TABLE IF EXISTS t1,t2;
--enable_warnings
CREATE TEMPORARY TABLE t1(a INT);
CREATE TEMPORARY TABLE t2(b INT);
CREATE TEMPORARY TABLE t3(c INT);
INSERT INTO t1 VALUES (1), (2), (3);
INSERT INTO t2 VALUES (11), (12), (13);
INSERT INTO t3 VALUES (101), (102), (103);
ANALYZE TABLE t1, t2, t3;
INSERT INTO t1 VALUES (1), (2), (3);
INSERT INTO t2 VALUES (11), (12), (13);
INSERT INTO t3 VALUES (101), (102), (103);
CHECK TABLE t1, t2, t3;
INSERT INTO t1 VALUES (1), (2), (3);
INSERT INTO t2 VALUES (11), (12), (13);
INSERT INTO t3 VALUES (101), (102), (103);
--replace_column 2 xxx
CHECKSUM TABLE t1, t2, t3;
INSERT INTO t1 VALUES (1), (2), (3);
INSERT INTO t2 VALUES (11), (12), (13);
INSERT INTO t3 VALUES (101), (102), (103);
OPTIMIZE TABLE t1, t2, t3;
INSERT INTO t1 VALUES (1), (2), (3);
INSERT INTO t2 VALUES (11), (12), (13);
INSERT INTO t3 VALUES (101), (102), (103);
REPAIR TABLE t1, t2, t3;
DROP TABLES t1, t2, t3;
CREATE TEMPORARY TABLE t1 (a int);
RENAME TABLE t1 TO t2;
DROP TABLE t2;
#
# CREATE TEMPORARY TEMPORARY TABLE
#
--error ER_PARSE_ERROR
create temporary temporary table t1 (a int);
#
# MDEV-7832 Add status variables to track CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE
#
flush status;
create table t1 (a int);
create temporary table t2 (a int);
create temporary table t3 (a int);
drop table t1;
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 #
--echo # ALTER TABLE RENAME & ENABLE/DISABLE KEYS (shortcuts)
--echo #
CREATE TEMPORARY TABLE t1(i INT PRIMARY KEY) ENGINE=MYISAM;
INSERT INTO t1 VALUES(1);
SELECT COUNT(*)=1 FROM t1;
ALTER TABLE t1 RENAME t2;
SELECT COUNT(*)=1 FROM t2;
ALTER TABLE t2 RENAME t1;
ALTER TABLE t1 DISABLE KEYS;
ALTER TABLE t1 ENABLE KEYS;
# LOCK TABLES is ignored for temporary tables.
LOCK TABLES t1 WRITE;
ALTER TABLE t1 RENAME t2;
SELECT COUNT(*)=1 FROM t2;
ALTER TABLE t2 RENAME t1;
ALTER TABLE t1 DISABLE KEYS;
ALTER TABLE t1 ENABLE KEYS;
UNLOCK TABLES;
LOCK TABLES t1 READ;
ALTER TABLE t1 RENAME t2;
SELECT COUNT(*)=1 FROM t2;
ALTER TABLE t2 RENAME t1;
ALTER TABLE t1 DISABLE KEYS;
ALTER TABLE t1 ENABLE KEYS;
UNLOCK TABLES;
FLUSH TABLES WITH READ LOCK;
ALTER TABLE t1 RENAME t2;
SELECT COUNT(*)=1 FROM t2;
ALTER TABLE t2 RENAME t1;
ALTER TABLE t1 DISABLE KEYS;
ALTER TABLE t1 ENABLE KEYS;
UNLOCK TABLES;
ALTER TABLE t1 RENAME t2, LOCK SHARED;
ALTER TABLE t2 RENAME t1, LOCK EXCLUSIVE;
DROP TABLE t1;
--echo #
--echo # MDEV-10792: Assertion `thd->mdl_context.is_lock_owner
--echo # (MDL_key::TABLE, table->db, table->table_name, MDL_SHARED)'
--echo # failed in mysql_rm_table_no_locks
--echo #
CREATE TEMPORARY TABLE t1 (i INT);
--error ER_BAD_TABLE_ERROR
DROP TABLE nonexisting_table, t1;
--echo # Cleanup
DROP DATABASE temp_db;
USE test;
--echo #
--echo # MDEV-17167 - InnoDB: Failing assertion: table->get_ref_count() == 0
--echo # upon truncating a temporary table
--echo #
CREATE TEMPORARY TABLE t1(a INT) ENGINE=InnoDB;
SELECT * FROM t1 AS t1a1, t1 AS t2a2;
TRUNCATE TABLE t1;
LOCK TABLES t1 WRITE;
TRUNCATE TABLE t1;
SELECT * FROM t1;
UNLOCK TABLES;
LOCK TABLES t1 AS t1a1 WRITE, t1 AS t1a2 WRITE;
TRUNCATE TABLE t1;
SELECT * FROM t1 AS t1a1, t1 AS t1a2;
UNLOCK TABLES;
CREATE TABLE t2(a INT) ENGINE=InnoDB;
LOCK TABLES t2 WRITE;
TRUNCATE TABLE t1;
UNLOCK TABLES;
DROP TABLE t1, t2;
--echo #
--echo # MDEV-19449 1030: Got error 168 "Unknown (generic) error from engine"
--echo # for valid TRUNCATE (temporary) TABLE
--echo #
CREATE TEMPORARY TABLE t1 (col1 BIGINT) ENGINE = InnoDB;
--error ER_BAD_FIELD_ERROR
INSERT INTO t1 (no_such_col) SELECT * FROM t1;
TRUNCATE TABLE t1;
--error ER_BAD_FIELD_ERROR
ALTER TABLE t1 CHANGE no_such_col1 col1 BIGINT NULL;
# This would wrongly try to re-truncate the old copy of the table that
# was not dropped during the first TRUNCATE due to extra table handles.
TRUNCATE TABLE t1;
DROP TEMPORARY TABLE t1;
--echo #
--echo # MDEV-21695 Server crashes in TABLE::evaluate_update_default_function upon UPDATE on temporary table
--echo #
SET timestamp=UNIX_TIMESTAMP('2001-01-01 10:20:30');
CREATE TEMPORARY TABLE t1 (a DATETIME ON UPDATE CURRENT_TIMESTAMP);
ALTER TABLE t1 ADD b INT;
INSERT INTO t1 (b) VALUES (1),(2);
--error ER_BAD_FIELD_ERROR
ALTER TABLE t1 CHANGE COLUMN x xx INT;
UPDATE t1 SET b = 3;
SELECT * FROM t1;
DROP TEMPORARY TABLE t1;
--echo #
--echo # End of 10.2 tests
--echo #
#
# DROP TEMPORARY TABLE fails in the middle
#
delimiter $$;
create function f1() returns int
begin
drop temporary table t1, t2;
return 1;
end;
$$
delimiter ;$$
create temporary table t1 (a int);
create temporary table t2 (a int);
insert t1 values (2);
insert t2 values (3);
--error ER_CANT_REOPEN_TABLE
select a,f1() from t1;
drop function f1;
drop temporary table t1;
--error ER_BAD_TABLE_ERROR
drop temporary table t2;
--echo #
--echo # End of 10.5 tests
--echo #
--echo #
--echo # Record that temporary table locks are always WRITE locks
--echo #
CREATE TEMPORARY TABLE t1 (a INT);
LOCK TABLE t1 READ;
TRUNCATE TABLE t1;
TRUNCATE TABLE t1;
UNLOCK TABLES;
DROP TABLE t1;
--echo #
--echo # End of 10.6 tests
--echo #