mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-30 04:26:45 +03:00 
			
		
		
		
	locking type of temp table The problem is that INSERT INTO .. SELECT FROM .. and CREATE TABLE .. SELECT FROM a temporary table could inadvertently overwrite the locking type of the temporary table. The lock type of temporary tables should be a write lock by default. The solution is to reset the lock type of temporary tables back to its default value after they are used in a statement.
		
			
				
	
	
		
			239 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # mysqltest should be fixed
 | |
| -- source include/not_embedded.inc
 | |
| #
 | |
| # Test of temporary tables
 | |
| #
 | |
| 
 | |
| --disable_warnings
 | |
| drop table if exists t1,t2;
 | |
| drop view if exists v1;
 | |
| --enable_warnings
 | |
| 
 | |
| 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;
 | |
| select * from t1 group by d;
 | |
| show status like "created_tmp%tables";
 | |
| 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 End of 5.1 tests
 |