Bug #12472 CREATE TABLE t AS SELECT spfunc gives "Table not locked with LOCK TABLES" error

Submitted: 9 Aug 2005 20:59 Modified: 22 May 2006 20:09
Reporter: Sergey Petrunya Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Locking Severity:S3 (Non-critical)
Version:5.0-bk OS:Any (any)
Assigned to: Dmitry Lenev CPU Architecture:Any

[9 Aug 2005 20:59] Sergey Petrunya
Description:
Attempt to run a statement 
CREATE TABLE t AS SELECT spfunc() 
where spfunc uses a table produces "Table ... was not locked with LOCK TABLES".  

How to repeat:
Run:
create table t1 as select 1 a;
delimiter //
create function f2() returns int deterministic reads sql data 
begin  
  return (select max(a) from t1); 
end; //

delimiter //

create table t2 as select f2();

And get the error:
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES

Suggested fix:
I think such statements should be supported. If they aren't, we need to document what class of statements is not supported (e.g. no SP function calls in DDL statements??).
[2 Oct 2005 2:45] Markus Popp
I also just found this problem. I think this should be solved before MySQL 5 becomes a Production Release.

Here's my example:

mysql> DROP TABLE IF EXISTS t1;
Query OK, 0 rows affected (0.06 sec)

mysql> CREATE TABLE t1 (
    ->   id int(11) NOT NULL auto_increment,
    ->   `name` varchar(20) NOT NULL default '',
    ->   decval decimal(6,2) NOT NULL default '0.00',
    ->   PRIMARY KEY  (id),
    ->   KEY ind_decval (decval)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.08 sec)

mysql> INSERT INTO t1 (id, name, decval) VALUES (1, 'abc', 4.00);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO t1 (id, name, decval) VALUES (2, 'def', 9.70);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO t1 (id, name, decval) VALUES (3, 'ghi', 6.40);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO t1 (id, name, decval) VALUES (4, 'slf', 4.20);
Query OK, 1 row affected (0.05 sec)

mysql> DROP TABLE IF EXISTS t2;
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> CREATE TABLE t2 (
    ->   id int(11) NOT NULL auto_increment,
    ->   id_t1 int(11) NOT NULL default '0',
    ->   decval decimal(6,2) NOT NULL default '0.00',
    ->   PRIMARY KEY  (id),
    ->   KEY id_t1 (id_t1),
    ->   KEY ind_decval (decval)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (1, 2, 8.50);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (2, 1, 8.50);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (4, 2, 6.20);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (5, 3, 4.00);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (6, 2, 4.20);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (8, 3, 5.60);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (9, 4, 8.10);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (10, 2, 0.70);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (12, 1, 4.50);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (29, 3, 5.60);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (30, 4, 8.10);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (31, 2, 0.70);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO t2 (id, id_t1, decval) VALUES (33, 1, 4.50);
Query OK, 1 row affected (0.05 sec)

mysql> ALTER TABLE `t2`
    ->   ADD CONSTRAINT t2_ibfk_1 FOREIGN KEY (id_t1) REFERENCES t1 (id);
Query OK, 13 rows affected (0.08 sec)
Records: 13  Duplicates: 0  Warnings: 0

mysql> DELIMITER $$
mysql>
mysql> DROP FUNCTION IF EXISTS getValue$$
Query OK, 0 rows affected (0.11 sec)

mysql> CREATE FUNCTION  getValue(_id INT) RETURNS decimal(6,2)
    -> BEGIN
    ->   DECLARE _retval DECIMAL(6,2);
    ->
    ->   SELECT decval FROM t1 WHERE id = _id INTO _retval;
    ->
    ->   RETURN _retval;
    ->
    -> END$$
Query OK, 0 rows affected (0.06 sec)

mysql>
mysql> DELIMITER ;
mysql> drop table if exists t3;
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> show warnings;
+-------+------+--------------------+
| Level | Code | Message            |
+-------+------+--------------------+
| Note  | 1051 | Unknown table 't3' |
+-------+------+--------------------+
1 row in set (0.06 sec)

mysql> create table t3 select id, getValue(id_t1) as decval_t1, decval as decval
_t2 from t2;
ERROR 1100 (HY000): Table 't3' was not locked with LOCK TABLES
mysql>
[19 Jan 2006 6:36] Gregg Green
I have the same basic problem. I want to create a table from a VIEW that contains calculated columns that use functions. If I remove the calculated columns from the view the problem goes away. I can view all records in the view with a select statement, so I would expect to be able to create a table using the same select statement.
[8 Feb 2006 11:32] Dmitry Lenev
Bug #14150 is marked as duplicate of this bug.
[3 Apr 2006 15:01] Beat Vontobel
The original bug description "where spfunc uses a table" is not completely correct. The bug occurs also on a deterministic function that doesn't make use of any tables if it resides in another database:

localhost-test [root]> use test;
Database changed
localhost-test [root]> create function f() returns int deterministic return 1;
Query OK, 0 rows affected (0.52 sec)

localhost-(none) [root]> create database test2;
Query OK, 1 row affected (0.00 sec)

localhost-(none) [root]> use test2
Database changed
localhost-test2 [root]> create table t1 (i INT);
Query OK, 0 rows affected (0.00 sec)

localhost-test2 [root]> insert into t1 values (1), (2);
Query OK, 2 rows affected (0.24 sec)
Records: 2  Duplicates: 0  Warnings: 0

localhost-test2 [root]> CREATE TABLE t2 SELECT test.f() FROM t1;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES
localhost-test2 [root]> CREATE TABLE test2.t2 SELECT test.f() FROM test2.t1;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES

It's the same behaviour from a users point of view (that's why I added it here), but it might come from a different source internally (so please tell me, if I should open a separate report for this), it could for example be related to my bug #18444.
[20 Apr 2006 20:51] Konstantin Osipov
This bug is fixed by the same patch that fixes Bug#15137
[18 May 2006 21:06] Dmitry Lenev
Fixed in 5.0.22 and 5.1.11
[18 May 2006 21:12] Dmitry Lenev
CREATE TABLE ... SELECT ... statement which was explicitly or implicitly
(through view) using stored function gave "Table not locked" error.
[22 May 2006 20:09] Paul DuBois
Noted in 5.0.22, 5.1.11 changelogs.

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.061 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.