Bug #119820 Update Temporary table: Can't reopen table
Submitted: 31 Jan 11:14 Modified: 31 Jan 12:37
Reporter: Chunling Qin Email Updates:
Status: Not a Bug Impact on me:
None 
Category:MySQL Server: DML Severity:S2 (Serious)
Version: OS:Any
Assigned to: CPU Architecture:Any

[31 Jan 11:14] Chunling Qin
Description:
MySQL UPDATE statement referencing the same temporary table in both the main query and a subquery triggers "ERROR 1137 (HY000): Can't reopen table: 'v0'"

mysql>   CREATE TEMPORARY TABLE v0 ( v1 BIGINT UNIQUE NOT NULL );
Query OK, 0 rows affected (0.01 sec)

mysql>   INSERT INTO v0 ( v1 ) VALUES ( 127 );
Query OK, 1 row affected (0.01 sec)

mysql> 
mysql> UPDATE v0 SET v1 = 67
    -> WHERE v1 NOT IN (
    ->     94, 10, 42,
    ->     (SELECT calc_value
    ->      FROM (
    ->         SELECT v1 AS calc_value FROM v0 WHERE v1 REGEXP '^[0-9.-]+$'
    ->         UNION
    ->         SELECT -128 AS calc_value FROM v0
    ->      ) AS v2
    ->      WHERE calc_value >= -128 AND calc_value < 100000000
    ->      LIMIT 1
    ->     )
    -> );
ERROR 1137 (HY000): Can't reopen table: 'v0'

Results from tidb:

mysql> drop table v0;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TEMPORARY TABLE v0 ( v1 BIGINT UNIQUE NOT NULL ); 
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO v0 ( v1 ) VALUES ( 127 );
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> UPDATE v0 SET v1 = 67
    -> WHERE v1 NOT IN (
    ->     94, 10, 42,
    ->     (SELECT calc_value
    ->      FROM (
    ->         SELECT v1 AS calc_value FROM v0 WHERE v1 REGEXP '^[0-9.-]+$'
    ->         UNION
    ->         SELECT -128 AS calc_value FROM v0
    ->      ) AS v2
    ->      WHERE calc_value >= -128 AND calc_value < 100000000 
    ->      LIMIT 1
    ->     )
    -> );
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

How to repeat:
drop table v0;
CREATE TEMPORARY TABLE v0 ( v1 BIGINT UNIQUE NOT NULL );
INSERT INTO v0 ( v1 ) VALUES ( 127 );

UPDATE v0 SET v1 = 67
WHERE v1 NOT IN (
    94, 10, 42,
    (SELECT calc_value
     FROM (
        SELECT v1 AS calc_value FROM v0 WHERE v1 REGEXP '^[0-9.-]+$'
        UNION
        SELECT -128 AS calc_value FROM v0
     ) AS v2
     WHERE calc_value >= -128 AND calc_value < 100000000
     LIMIT 1
    )
);
[31 Jan 12:37] MySQL Verification Team
It's not really a bug, see here:

https://dev.mysql.com/doc/refman/8.4/en/temporary-table-problems.html
"You cannot refer to a TEMPORARY table more than once in the same query. For example, the following does not work: "

If you want ot follow a feature request to allow this,  please refer to:
https://bugs.mysql.com/bug.php?id=10327