Bug #36657 | Can't reopen TEMPORARY table in 2 independent SELECTs in a FUNCTION | ||
---|---|---|---|
Submitted: | 12 May 2008 1:53 | Modified: | 12 May 2008 7:58 |
Reporter: | Ondra Zizka | Email Updates: | |
Status: | Duplicate | Impact on me: | |
Category: | MySQL Server: Stored Routines | Severity: | S3 (Non-critical) |
Version: | 5.0.51a, 5.0.60 | OS: | Any |
Assigned to: | CPU Architecture: | Any | |
Tags: | alias, reopen, temporary table |
[12 May 2008 1:53]
Ondra Zizka
[12 May 2008 7:03]
Valeriy Kravchuk
Thank you for a problem report. Verified just as described with 5.0.60: C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -uroot -proot test -P3308 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.0.60-enterprise-gpl-nt MySQL Enterprise Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> drop table if exists a; Query OK, 0 rows affected (0.13 sec) mysql> create table a(i int); Query OK, 0 rows affected (0.09 sec) mysql> insert into a values(1),(2); Query OK, 2 rows affected (0.03 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> create temporary table atemp select * from a; Query OK, 2 rows affected (0.09 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> drop function if exists fa; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> delimiter // mysql> create function fa() returns int begin -> declare x, y int default 0; -> select i into x from atemp AS aliasA where i=1; -> select i into y from atemp AS aliasB where i=1; -> return x; -> end; -> // Query OK, 0 rows affected (0.05 sec) mysql> select fa()// ERROR 1137 (HY000): Can't reopen table: 'aliasB' mysql> drop function if exists fa// Query OK, 0 rows affected (0.02 sec) mysql> create function fa() returns int begin -> declare x, y int default 0; -> select i into x from atemp AS aliasA where i=1; -> select i into y from atemp where i=1; -> return x; -> end; -> // Query OK, 0 rows affected (0.00 sec) mysql> select fa()// ERROR 1137 (HY000): Can't reopen table: 'atemp' mysql> drop function if exists fa// Query OK, 0 rows affected (0.00 sec) mysql> create function fa() returns int begin -> declare x, y int default 0; -> select i into x from atemp AS aliasA where i=1; -> select i into y from atemp AS aliasA where i=1; -> return x; -> end; -> // Query OK, 0 rows affected (0.00 sec) mysql> select fa()// +------+ | fa() | +------+ | 1 | +------+ 1 row in set (0.01 sec) Manual (http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html) clearly says: "You cannot refer to a TEMPORARY table more than once in the same query." But it is not clear if entire stored function/procedure should be treated as "same query". If current behaviour is intended (I think so) then manual page quoted above should be clarified, with additional example like this.
[12 May 2008 7:12]
Valeriy Kravchuk
This is a duplicate of Bug #36653 actually.
[12 May 2008 7:50]
Ondra Zizka
Ok. Sorry for the duplicate, but I wasn't able to find that - it does not have appropriate keywords in the title.
[12 May 2008 7:58]
Ondra Zizka
Ah, I see. We did it almost at the same time, therefore the duplication. Note that it works well for a PROCEDURE. Procedure call is not treated as "same query"? drop table if exists a; create table a(i int); insert into a values(1),(2); create temporary table atemp select * from a; drop function if exists fa; delimiter | create procedure fa() begin declare x, y int default 0; select i into x from atemp AS aliasA where i=1; select i into y from atemp AS aliasB where i=1; end; | delimiter ; CALL fa();