mirror of
https://github.com/MariaDB/server.git
synced 2025-05-01 08:45:04 +03:00
1.) Added a new option to mysql_lock_tables() for ignoring FLUSH TABLES. Used the new option in create_table_from_items(). It is necessary to prevent the SELECT table from being reopend. It would get new storage assigned for its fields, while the SELECT part of the command would still use the old (freed) storage. 2.) Protected the CREATE TABLE and CREATE TABLE ... SELECT commands against a global read lock. This prevents a deadlock in CREATE TABLE ... SELECT in conjunction with FLUSH TABLES WITH READ LOCK and avoids the creation of new tables during a global read lock. 3.) Replaced set_protect_against_global_read_lock() and unset_protect_against_global_read_lock() by wait_if_global_read_lock() and start_waiting_global_read_lock() in the INSERT DELAYED handling. mysql-test/r/create.result: Bug#10224 - ANALYZE TABLE crashing with simultaneous CREATE ... SELECT statement. Added test results. mysql-test/t/create.test: Bug#10224 - ANALYZE TABLE crashing with simultaneous CREATE ... SELECT statement. Added tests which do not require concurrency. sql/lock.cc: Bug#10224 - ANALYZE TABLE crashing with simultaneous CREATE ... SELECT statement. Added a new option to mysql_lock_tables() for ignoring FLUSH TABLES. Changed the parameter list. Removed two unnecessary functions. Their functionality is included in wait_if_global_read_lock() and start_waiting_global_read_lock(). sql/mysql_priv.h: Bug#10224 - ANALYZE TABLE crashing with simultaneous CREATE ... SELECT statement. Changed the declaration of mysql_lock_tables(). Added definitions for the new options. sql/sql_acl.cc: Bug#10224 - ANALYZE TABLE crashing with simultaneous CREATE ... SELECT statement. Adjusted mysql_lock_tables() calls to the new argument list. sql/sql_base.cc: Bug#10224 - ANALYZE TABLE crashing with simultaneous CREATE ... SELECT statement. Adjusted mysql_lock_tables() calls to the new argument list. sql/sql_handler.cc: Bug#10224 - ANALYZE TABLE crashing with simultaneous CREATE ... SELECT statement. Adjusted mysql_lock_tables() calls to the new argument list. sql/sql_insert.cc: Bug#10224 - ANALYZE TABLE crashing with simultaneous CREATE ... SELECT statement. Replaced set_protect_against_global_read_lock() and unset_protect_against_global_read_lock() by wait_if_global_read_lock() and start_waiting_global_read_lock() in the INSERT DELAYED handling. Adjusted mysql_lock_tables() calls to the new argument list. sql/sql_parse.cc: Bug#10224 - ANALYZE TABLE crashing with simultaneous CREATE ... SELECT statement. Protected the CREATE TABLE and CREATE TABLE ... SELECT commands against a global read lock. This prevents a deadlock in CREATE TABLE ... SELECT in conjunction with FLUSH TABLES WITH READ LOCK and avoids the creation of new tables during a global read lock. sql/sql_table.cc: Bug#10224 - ANALYZE TABLE crashing with simultaneous CREATE ... SELECT statement. Adjusted mysql_lock_tables() calls to the new argument list. Used the new option in create_table_from_items().
221 lines
5.5 KiB
Plaintext
221 lines
5.5 KiB
Plaintext
#
|
|
# Check some special create statements.
|
|
#
|
|
|
|
drop table if exists t1,t2;
|
|
create table t1 (b char(0));
|
|
insert into t1 values (""),(null);
|
|
select * from t1;
|
|
drop table if exists t1;
|
|
|
|
create table t1 (b char(0) not null);
|
|
create table if not exists t1 (b char(0) not null);
|
|
insert into t1 values (""),(null);
|
|
select * from t1;
|
|
drop table if exists t1;
|
|
|
|
#
|
|
# Test of some CREATE TABLE'S that should fail
|
|
#
|
|
|
|
--error 1146
|
|
create table t2 type=heap select * from t1;
|
|
--error 1146
|
|
create table t2 select auto+1 from t1;
|
|
drop table if exists t1,t2;
|
|
--error 1167
|
|
create table t1 (b char(0) not null, index(b));
|
|
--error 1164
|
|
create table t1 (a int not null auto_increment,primary key (a)) type=heap;
|
|
--error 1163
|
|
create table t1 (a int not null,b text) type=heap;
|
|
drop table if exists t1;
|
|
|
|
--error 1164
|
|
create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) type=heap;
|
|
|
|
-- error 1044,1
|
|
create table not_existing_database.test (a int);
|
|
--error 1103
|
|
create table `a/a` (a int);
|
|
--error 1103
|
|
create table `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa int);
|
|
--error 1059
|
|
create table a (`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` int);
|
|
|
|
#
|
|
# test of dummy table names
|
|
#
|
|
|
|
create table 1ea10 (1a20 int,1e int);
|
|
insert into 1ea10 values(1,1);
|
|
select 1ea10.1a20,1e+ 1e+10 from 1ea10;
|
|
drop table 1ea10;
|
|
create table t1 (t1.index int);
|
|
drop table t1;
|
|
drop database if exists test_$1;
|
|
create database test_$1;
|
|
create table test_$1.$test1 (a$1 int, $b int, c$ int);
|
|
insert into test_$1.$test1 values (1,2,3);
|
|
select a$1, $b, c$ from test_$1.$test1;
|
|
create table test_$1.test2$ (a int);
|
|
drop table test_$1.test2$;
|
|
drop database test_$1;
|
|
|
|
--error 1103
|
|
create table `` (a int);
|
|
--error 1103
|
|
drop table if exists ``;
|
|
--error 1166
|
|
create table t1 (`` int);
|
|
drop table if exists t1;
|
|
|
|
#
|
|
# Test of CREATE ... SELECT with indexes
|
|
#
|
|
|
|
create table t1 (a int auto_increment not null primary key, B CHAR(20));
|
|
insert into t1 (b) values ("hello"),("my"),("world");
|
|
create table t2 (key (b)) select * from t1;
|
|
explain select * from t2 where b="world";
|
|
select * from t2 where b="world";
|
|
drop table t1,t2;
|
|
|
|
#
|
|
# Test types after CREATE ... SELECT
|
|
#
|
|
|
|
create table t1(x varchar(50) );
|
|
create table t2 select x from t1 where 1=2;
|
|
describe t1;
|
|
describe t2;
|
|
drop table t2;
|
|
create table t2 select now() as a , curtime() as b, curdate() as c , 1+1 as d , 1.0 + 1 as e , 33333333333333333 + 3 as f;
|
|
describe t2;
|
|
drop table t2;
|
|
create table t2 select CAST("2001-12-29" AS DATE) as d, CAST("20:45:11" AS TIME) as t, CAST("2001-12-29 20:45:11" AS DATETIME) as dt;
|
|
describe t2;
|
|
drop table t1,t2;
|
|
|
|
#
|
|
# Test of primary key with 32 index
|
|
#
|
|
|
|
create table t1 (a int not null, b int, primary key(a), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b));
|
|
show create table t1;
|
|
drop table t1;
|
|
create table t1 select if(1,'1','0'), month("2002-08-02");
|
|
drop table t1;
|
|
create table t1 select if('2002'='2002','Y','N');
|
|
select * from t1;
|
|
drop table if exists t1;
|
|
|
|
#
|
|
# Test default table type
|
|
#
|
|
SET SESSION table_type="heap";
|
|
SELECT @@table_type;
|
|
CREATE TABLE t1 (a int not null);
|
|
show create table t1;
|
|
drop table t1;
|
|
# Test what happens when using a non existing table type
|
|
SET SESSION table_type="gemini";
|
|
SELECT @@table_type;
|
|
CREATE TABLE t1 (a int not null);
|
|
show create table t1;
|
|
SET SESSION table_type=default;
|
|
drop table t1;
|
|
|
|
|
|
#
|
|
# ISO requires that primary keys are implicitly NOT NULL
|
|
#
|
|
create table t1 ( k1 varchar(2), k2 int, primary key(k1,k2));
|
|
insert into t1 values ("a", 1), ("b", 2);
|
|
--error 1048
|
|
insert into t1 values ("c", NULL);
|
|
--error 1048
|
|
insert into t1 values (NULL, 3);
|
|
--error 1048
|
|
insert into t1 values (NULL, NULL);
|
|
drop table t1;
|
|
|
|
#
|
|
# Bug #801
|
|
#
|
|
|
|
create table t1 select x'4132';
|
|
drop table t1;
|
|
|
|
#
|
|
# bug #1434
|
|
#
|
|
|
|
create table t1 select 1,2,3;
|
|
create table if not exists t1 select 1,2;
|
|
--error 1136
|
|
create table if not exists t1 select 1,2,3,4;
|
|
create table if not exists t1 select 1;
|
|
select * from t1;
|
|
drop table t1;
|
|
create table t1 select 1,2,3;
|
|
create table if not exists t1 select 1,2;
|
|
--error 1136
|
|
create table if not exists t1 select 1,2,3,4;
|
|
create table if not exists t1 select 1;
|
|
select * from t1;
|
|
drop table t1;
|
|
|
|
#
|
|
# Test create table if not exists with duplicate key error
|
|
#
|
|
|
|
create table t1 (a int not null, b int, primary key (a));
|
|
insert into t1 values (1,1);
|
|
create table if not exists t1 select 2;
|
|
select * from t1;
|
|
create table if not exists t1 select 3 as 'a',4 as 'b';
|
|
--error 1062
|
|
create table if not exists t1 select 3 as 'a',3 as 'b';
|
|
select * from t1;
|
|
drop table t1;
|
|
|
|
#
|
|
# Test for Bug #2985
|
|
# "Table truncated when creating another table name with Spaces"
|
|
#
|
|
|
|
--error 1103
|
|
create table `t1 `(a int);
|
|
--error 1102
|
|
create database `db1 `;
|
|
--error 1166;
|
|
create table t1(`a ` int);
|
|
|
|
#
|
|
# Test for Bug #3481
|
|
# "Parser permits multiple commas without syntax error"
|
|
#
|
|
|
|
--error 1064
|
|
create table t1 (a int,);
|
|
--error 1064
|
|
create table t1 (a int,,b int);
|
|
--error 1064
|
|
create table t1 (,b int);
|
|
|
|
#
|
|
# Bug#10224 - ANALYZE TABLE crashing with simultaneous
|
|
# CREATE ... SELECT statement.
|
|
# This tests two additional possible errors and a hang if
|
|
# an improper fix is present.
|
|
#
|
|
create table t1 (a int);
|
|
--error 1093
|
|
create table t1 select * from t1;
|
|
--error 1093
|
|
create table t2 union = (t1) select * from t1;
|
|
flush tables with read lock;
|
|
unlock tables;
|
|
drop table t1;
|