call mtr.add_suppression("table or database name 't-1'");
#
# Check some special create statements.
#

--disable_warnings
drop table if exists t1,t2,t3,t4,t5;
drop database if exists mysqltest;
drop view if exists v1;
--enable_warnings

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 t1;

create table t1 (a int not null auto_increment,primary key (a)) engine=heap;
drop table t1;

#
# Test of some CREATE TABLE'S that should fail
#

--error 1146
create table t2 engine=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 1163
create table t1 (a int not null,b text) engine=heap;
drop table if exists t1;

--error 1075
create table t1 (ordid int(8) not null auto_increment, ord  varchar(50) not null, primary key (ord,ordid)) engine=heap;

-- error 1049
create table not_existing_database.test (a int);
create table `a/a` (a int);
show create table `a/a`;
create table t1 like `a/a`;
drop table `a/a`;
drop table `t1`;
--error 1103
create table `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa int);
--error 1059
create table a (`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` int);

#
# Some wrong defaults, so these creates should fail too (Bug #5902)
#
create table t1 (a datetime default now());
drop table t1;
create table t1 (a datetime on update now());
drop table t1;
--error 1067
create table t1 (a int default 100 auto_increment);
--error 1067
create table t1 (a tinyint default 1000);
--error 1067
create table t1 (a varchar(5) default 'abcdef');

create table t1 (a varchar(5) default 'abcde');
insert into t1 values();
select * from t1;
--error 1067
alter table t1 alter column a set default 'abcdef';
drop table t1;

#
# 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;
# Test that we get warning for this
drop database if exists mysqltest;
create database mysqltest;
create table mysqltest.$test1 (a$1 int, $b int, c$ int);
insert into mysqltest.$test1 values (1,2,3);
select a$1, $b, c$ from mysqltest.$test1;
create table mysqltest.test2$ (a int);
drop table mysqltest.test2$;
drop database mysqltest;

--error 1103
create table `` (a int);
--error 1103
drop table if exists ``;
--error 1166
create table t1 (`` int);
--error 1280
create table t1 (i int, index `` (i)); 

#
# CREATE TABLE under LOCK TABLES
#
# We don't allow creation of non-temporary tables under LOCK TABLES
# as following meta-data locking protocol in this case can lead to
# deadlock.
create table t1 (i int);
lock tables t1 read;
--error ER_TABLE_NOT_LOCKED
create table t2 (j int);
# OTOH creating of temporary table should be OK
create temporary table t2 (j int);
drop temporary table t2;
unlock tables;
drop table 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 CREATE ... SELECT with duplicate fields
#

create table t1 (a tinyint);
create table t2 (a int) select * from t1;                        
describe t1;
describe t2;
drop table if exists t2;
--error 1060
create table t2 (a int, a float) select * from t1;               
drop table if exists t2;
--error 1060
create table t2 (a int) select a as b, a+1 as b from t1;         
drop table if exists t2;
--error 1060
create table t2 (b int) select a as b, a+1 as b from t1;         
drop table if exists t1,t2;

#
# Test CREATE ... SELECT when insert fails
#

CREATE TABLE t1 (a int not null);
INSERT INTO t1 values (1),(2),(1);
--error ER_DUP_ENTRY
CREATE TABLE t2 (primary key(a)) SELECT * FROM t1;
--error 1146
SELECT * from t2;
DROP TABLE t1;
DROP TABLE IF EXISTS 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 storage_engine="heap";
SELECT @@storage_engine;
CREATE TABLE t1 (a int not null);
show create table t1;
drop table t1;
--error 1286
SET SESSION storage_engine="gemini";
SELECT @@storage_engine;
CREATE TABLE t1 (a int not null);
show create table t1;
SET SESSION storage_engine=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;
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
#

flush status;
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';
show warnings;
show status like "Opened_tables";
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);

#
# Test create with foreign keys
#

create table t1 (a int, key(a));
create table t2 (b int, foreign key(b) references t1(a), key(b));
drop table if exists t2,t1;

#
# Test for CREATE TABLE .. LIKE ..
#

create table t1(id int not null, name char(20));
insert into t1 values(10,'mysql'),(20,'monty- the creator');
create table t2(id int not null);
insert into t2 values(10),(20);
create table t3 like t1;
show create table t3;
select * from t3;
# Disable PS becasue of @@warning_count
create table if not exists t3 like t1;
--disable_ps_protocol
select @@warning_count;
--enable_ps_protocol
create temporary table t3 like t2;
show create table t3;
select * from t3;
drop table t3;
show create table t3;
select * from t3;
drop table t2, t3;
create database mysqltest;
create table mysqltest.t3 like t1;
create temporary table t3 like mysqltest.t3;
show create table t3;
create table t2 like t3;
show create table t2;
select * from t2;
create table t3 like t1;
--error 1050
create table t3 like mysqltest.t3;
--error 1049
create table non_existing_database.t1 like t1;
--error ER_NO_SUCH_TABLE
create table t3 like non_existing_table;
--error 1050
create temporary table t3 like t1;
drop table t1, t2, t3;
drop table t3;
drop database mysqltest;

#
# CREATE TABLE LIKE under LOCK TABLES
#
# Similarly to ordinary CREATE TABLE we don't allow creation of
# non-temporary tables under LOCK TABLES. Also we require source
# table to be locked.
create table t1 (i int);
create table t2 (j int);
lock tables t1 read;
--error ER_TABLE_NOT_LOCKED
create table t3 like t1;
# OTOH creating of temporary table should be OK
create temporary table t3 like t1;
drop temporary table t3;
# Source table should be locked
--error ER_TABLE_NOT_LOCKED
create temporary table t3 like t2;
unlock tables;
drop tables t1, t2;

#
# Test default table type
#
SET SESSION storage_engine="heap";
SELECT @@storage_engine;
CREATE TABLE t1 (a int not null);
show create table t1;
drop table t1;
--error 1286
SET SESSION storage_engine="gemini";
SELECT @@storage_engine;
CREATE TABLE t1 (a int not null);
show create table t1;
SET SESSION storage_engine=default;
drop table t1;

#
# Test types of data for create select with functions
#

create table t1(a int,b int,c int unsigned,d date,e char,f datetime,g time,h blob);
insert into t1(a)values(1);
insert into t1(a,b,c,d,e,f,g,h)
values(2,-2,2,'1825-12-14','a','2003-1-1 3:2:1','4:3:2','binary data');
select * from t1;
select a, 
    ifnull(b,cast(-7 as signed)) as b, 
    ifnull(c,cast(7 as unsigned)) as c, 
    ifnull(d,cast('2000-01-01' as date)) as d, 
    ifnull(e,cast('b' as char)) as e,
    ifnull(f,cast('2000-01-01' as datetime)) as f, 
    ifnull(g,cast('5:4:3' as time)) as g,
    ifnull(h,cast('yet another binary data' as binary)) as h,
    addtime(cast('1:0:0' as time),cast('1:0:0' as time)) as dd 
from t1;

create table t2
select
    a, 
    ifnull(b,cast(-7                        as signed))   as b,
    ifnull(c,cast(7                         as unsigned)) as c,
    ifnull(d,cast('2000-01-01'              as date))     as d,
    ifnull(e,cast('b'                       as char))     as e,
    ifnull(f,cast('2000-01-01'              as datetime)) as f,
    ifnull(g,cast('5:4:3'                   as time))     as g,
    ifnull(h,cast('yet another binary data' as binary))   as h,
    addtime(cast('1:0:0' as time),cast('1:0:0' as time))  as dd
from t1;
explain t2;
select * from t2;
drop table t1, t2;

create table t1 (a tinyint, b smallint, c mediumint, d int, e bigint, f float(3,2), g double(4,3), h decimal(5,4), i year, j date, k timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, l datetime, m enum('a','b'), n set('a','b'), o char(10));
create table t2 select ifnull(a,a), ifnull(b,b), ifnull(c,c), ifnull(d,d), ifnull(e,e), ifnull(f,f), ifnull(g,g), ifnull(h,h), ifnull(i,i), ifnull(j,j), ifnull(k,k), ifnull(l,l), ifnull(m,m), ifnull(n,n), ifnull(o,o) from t1;
show create table t2;
drop table t1,t2;

#
# Test of default()
#
create table t1(str varchar(10) default 'def',strnull varchar(10),intg int default '10',rel double default '3.14');
insert into t1 values ('','',0,0.0);
describe t1;
create table t2 select default(str) as str, default(strnull) as strnull, default(intg) as intg, default(rel) as rel from t1;
describe t2;
drop table t1, t2;

#
# Bug #2075
#

create table t1(name varchar(10), age smallint default -1);
describe t1;
create table t2(name varchar(10), age smallint default - 1);
describe t2;
drop table t1, t2;

#
# test for bug #1427 "enum allows duplicate values in the list"
#

create table t1(cenum enum('a'), cset set('b'));
create table t2(cenum enum('a','a'), cset set('b','b'));
create table t3(cenum enum('a','A','a','c','c'), cset set('b','B','b','d','d'));
drop table t1, t2, t3;

#
# Bug #1209
#

create database mysqltest;
use mysqltest;
select database();
drop database mysqltest;
select database();

# Connect without a database as user mysqltest_1
create user mysqltest_1;
connect (user1,localhost,mysqltest_1,,*NO-ONE*);
connection user1;
select database(), user();
connection default;
disconnect user1;
drop user mysqltest_1;
use test;

#
# Test for Bug 856 'Naming a key "Primary" causes trouble'
#

--error 1280
create table t1 (a int, index `primary` (a));
--error 1280
create table t1 (a int, index `PRIMARY` (a));

create table t1 (`primary` int, index(`primary`));
show create table t1;
create table t2 (`PRIMARY` int, index(`PRIMARY`));
show create table t2;

create table t3 (a int);
--error 1280
alter table t3 add index `primary` (a);
--error 1280
alter table t3 add index `PRIMARY` (a);

create table t4 (`primary` int);
alter table t4 add index(`primary`);
show create table t4;
create table t5 (`PRIMARY` int);
alter table t5 add index(`PRIMARY`);
show create table t5;

drop table t1, t2, t3, t4, t5;

#
# bug #3266 TEXT in CREATE TABLE SELECT
#

CREATE TABLE t1(id varchar(10) NOT NULL PRIMARY KEY, dsc longtext);
INSERT INTO t1 VALUES ('5000000001', NULL),('5000000003', 'Test'),('5000000004', NULL);
CREATE TABLE t2(id varchar(15) NOT NULL, proc varchar(100) NOT NULL, runID varchar(16) NOT NULL, start datetime NOT NULL, PRIMARY KEY  (id,proc,runID,start));

INSERT INTO t2 VALUES ('5000000001', 'proc01', '20031029090650', '2003-10-29 13:38:40'),('5000000001', 'proc02', '20031029090650', '2003-10-29 13:38:51'),('5000000001', 'proc03', '20031029090650', '2003-10-29 13:38:11'),('5000000002', 'proc09', '20031024013310', '2003-10-24 01:33:11'),('5000000002', 'proc09', '20031024153537', '2003-10-24 15:36:04'),('5000000004', 'proc01', '20031024013641', '2003-10-24 01:37:29'),('5000000004', 'proc02', '20031024013641', '2003-10-24 01:37:39');

CREATE TABLE t3  SELECT t1.dsc,COUNT(DISTINCT t2.id) AS countOfRuns  FROM t1 LEFT JOIN t2 ON (t1.id=t2.id) GROUP BY t1.id;
SELECT * FROM t3;
drop table t1, t2, t3;

#
# Bug#9666: Can't use 'DEFAULT FALSE' for column of type bool
#
create table t1 (b bool not null default false);
create table t2 (b bool not null default true);
insert into t1 values ();
insert into t2 values ();
select * from t1;
select * from t2;
drop table t1,t2;

#
# 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 ER_TABLE_EXISTS_ERROR
create table t1 select * from t1;
--error ER_WRONG_OBJECT
create table t2 union = (t1) select * from t1;
flush tables with read lock;
unlock tables;
drop table t1;

#
# Bug#10413: Invalid column name is not rejected
#
--error 1103
create table t1(column.name int);
--error 1103
create table t1(test.column.name int);
--error 1102
create table t1(xyz.t1.name int);
create table t1(t1.name int);
create table t2(test.t2.name int);
drop table t1,t2;

#
# Bug #12537: UNION produces longtext instead of varchar
#
CREATE TABLE t1 (f1 VARCHAR(255) CHARACTER SET utf8);
CREATE TABLE t2 AS SELECT LEFT(f1,171) AS f2 FROM t1 UNION SELECT LEFT(f1,171) AS f2 FROM t1;
DESC t2;
DROP TABLE t1,t2;

#
# Bug#12913 Simple SQL can crash server or connection
#
CREATE TABLE t12913 (f1 ENUM ('a','b')) AS SELECT 'a' AS f1;
SELECT * FROM t12913;
DROP TABLE t12913;

#
# Bug#11028: Crash on create table like
#
create database mysqltest;
use mysqltest;
drop database mysqltest;
--error ER_NO_DB_ERROR 
create table test.t1 like x;
--disable_warnings
drop table if exists test.t1;
--enable_warnings

#
# Bug #6859: Bogus error message on attempt to CREATE TABLE t LIKE view
#
create database mysqltest;
use mysqltest;
# MXS: create view v1 as select 'foo' from dual;
# MXS: qc_get_table_names       : ERR: v1 != v1, dual
# MXS: qc_mysqlembedded does not consider "dual" as a table name.
--error 1347
create table t1 like v1;
drop view v1;
drop database mysqltest;
# Bug #6008 MySQL does not create warnings when
# creating database and using IF NOT EXISTS
#
create database mysqltest;
create database if not exists mysqltest character set latin2;
show create database mysqltest;
drop database mysqltest;
use test;
create table t1 (a int);
create table if not exists t1 (a int);
drop table t1;

# BUG#14139
create table t1 (
  a varchar(112) charset utf8 collate utf8_bin not null,
  primary key (a)
) select 'test' as a ;
#--warning 1364
show create table t1;
drop table t1;

#
# BUG#14480: assert failure in CREATE ... SELECT because of wrong
#            calculation of number of NULLs.
#
CREATE TABLE t2 (
  a int(11) default NULL
);
insert into t2 values(111);

#--warning 1364
create table t1 ( 
  a varchar(12) charset utf8 collate utf8_bin not null, 
  b int not null, primary key (a)
) select a, 1 as b from t2 ;
show create table t1;
drop table t1;

#--warning 1364
create table t1 ( 
  a varchar(12) charset utf8 collate utf8_bin not null, 
  b int not null, primary key (a)
) select a, 1 as c from t2 ;
show create table t1;
drop table t1;

#--warning 1364
create table t1 ( 
  a varchar(12) charset utf8 collate utf8_bin not null, 
  b int null, primary key (a)
) select a, 1 as c from t2 ;
show create table t1;
drop table t1;

#--warning 1364
create table t1 ( 
  a varchar(12) charset utf8 collate utf8_bin not null,
  b int not null, primary key (a)
) select 'a' as a , 1 as b from t2 ;
show create table t1;
drop table t1;

#--warning 1364
create table t1 ( 
  a varchar(12) charset utf8 collate utf8_bin,
  b int not null, primary key (a)
) select 'a' as a , 1 as b from t2 ;
show create table t1;
drop table t1, t2;

create table t1 ( 
  a1 int not null,
  a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int
);
insert into t1 values (1,1,1, 1,1,1, 1,1,1);

#--warning 1364
create table t2 ( 
  a1 varchar(12) charset utf8 collate utf8_bin not null,
  a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int,
  primary key (a1)
) select a1,a2,a3,a4,a5,a6,a7,a8,a9 from t1 ;
drop table t2;

#--warning 1364
create table t2 ( 
  a1 varchar(12) charset utf8 collate utf8_bin,
  a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int
) select a1,a2,a3,a4,a5,a6,a7,a8,a9 from t1;

drop table t1, t2;
#--warning 1364
create table t1 ( 
  a1 int, a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int
);
insert into t1 values (1,1,1, 1,1,1, 1,1,1);

#--warning 1364
create table t2 ( 
  a1 varchar(12) charset utf8 collate utf8_bin not null,
  a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int,
  primary key (a1)
) select a1,a2,a3,a4,a5,a6,a7,a8,a9 from t1 ;

# Test the default value
drop table t2;

create table t2 ( a int default 3, b int default 3)
  select a1,a2 from t1;
show create table t2;

drop table t1, t2;

#
# Bug #15316 SET value having comma not correctly handled
#
--error 1367
create table t1(a set("a,b","c,d") not null);

# End of 4.1 tests


#
# Bug #14155: Maximum value of MAX_ROWS handled incorrectly on 64-bit
# platforms
#
create table t1 (i int) engine=myisam max_rows=100000000000;
show create table t1;
alter table t1 max_rows=100;
show create table t1;
alter table t1 max_rows=100000000000;
show create table t1;
drop table t1;


#
# Tests for errors happening at various stages of CREATE TABLES ... SELECT
#
# (Also checks that it behaves atomically in the sense that in case
#  of error it is automatically dropped if it has not existed before.)
#
# Error during open_and_lock_tables() of tables
--error ER_NO_SUCH_TABLE
create table t1 select * from t2;
# A special case which is also caught during open tables pahse
--error ER_NO_SUCH_TABLE
create table t1 select * from t1;
# Error which happens before select_create::prepare()
--error ER_CANT_AGGREGATE_2COLLATIONS
create table t1 select coalesce('a' collate latin1_swedish_ci,'b' collate latin1_bin);
# Error during table creation
--error ER_KEY_COLUMN_DOES_NOT_EXITS
create table t1 (primary key(a)) select "b" as b;
# Error in select_create::prepare() which is not related to table creation
create table t1 (a int);
create table if not exists t1 select 1 as a, 2 as b;
drop table t1;
# Finally error which happens during insert
--error ER_DUP_ENTRY
create table t1 (primary key (a)) (select 1 as a) union all (select 1 as a);
# What happens if table already exists ?
create table t1 (i int);
--error ER_TABLE_EXISTS_ERROR
create table t1 select 1 as i;
create table if not exists t1 select 1 as i;
select * from t1;
# After WL#5370, it just generates a warning that the table already exists.
create table if not exists t1 select * from t1;
select * from t1;
drop table t1;
# Error before select_create::prepare()
--error ER_CANT_AGGREGATE_2COLLATIONS
create table t1 select coalesce('a' collate latin1_swedish_ci,'b' collate latin1_bin);


# Base vs temporary tables dillema (a.k.a. bug#24508 "Inconsistent
# results of CREATE TABLE ... SELECT when temporary table exists").
# In this situation we either have to create non-temporary table and
# insert data in it or insert data in temporary table without creation of
# permanent table. After patch for Bug#47418, we create the base table and
# instert data into it, even though a temporary table exists with the same
# name.
create temporary table t1 (j int);
create table if not exists t1 select 1;
select * from t1;
drop temporary table t1;
select * from t1;
drop table t1;


#
# CREATE TABLE ... SELECT and LOCK TABLES
#
# There is little sense in using CREATE TABLE ... SELECT under
# LOCK TABLES as it mostly does not work. At least we check that
# the server doesn't crash, hang and produces sensible errors.
# Includes test for bug #20662 "Infinite loop in CREATE TABLE
# IF NOT EXISTS ... SELECT with locked tables".
create table t1 (i int);
insert into t1 values (1), (2);
lock tables t1 read;
--error ER_TABLE_NOT_LOCKED
create table t2 select * from t1;
--error ER_TABLE_NOT_LOCKED
create table if not exists t2 select * from t1;
unlock tables;
create table t2 (j int);
lock tables t1 read;
--error ER_TABLE_NOT_LOCKED
create table t2 select * from t1;
# This should not be ever allowed as it will undermine
# lock-all-at-once approach
--error ER_TABLE_NOT_LOCKED
create table if not exists t2 select * from t1;
unlock tables;
lock table t1 read, t2 read;
--error ER_TABLE_NOT_LOCKED_FOR_WRITE
create table t2 select * from t1;
--error ER_TABLE_NOT_LOCKED_FOR_WRITE
create table if not exists t2 select * from t1;
unlock tables;
lock table t1 read, t2 write;
--error ER_TABLE_EXISTS_ERROR
create table t2 select * from t1;
# This is the only case which really works.
create table if not exists t2 select * from t1;
select * from t1;
unlock tables;
drop table t2;

# OTOH CREATE TEMPORARY TABLE ... SELECT should work
# well under LOCK TABLES.
lock tables t1 read;
create temporary table t2 select * from t1;
create temporary table if not exists t2 select * from t1;
select * from t2;
unlock tables;
drop table t1, t2;


#
# Bug#21772: can not name a column 'upgrade' when create a table
#
create table t1 (upgrade int);
drop table t1;


--echo
--echo Bug #26104 Bug on foreign key class constructor
--echo
--echo Check that ref_columns is initalized correctly in the constructor
--echo and semantic checks in mysql_prepare_table work.
--echo
--echo We do not need a storage engine that supports foreign keys
--echo for this test, as the checks are purely syntax-based, and the
--echo syntax is supported for all engines.
--echo
--disable_warnings
drop table if exists t1,t2;
--enable_warnings

create table t1(a int not null, b int not null, primary key (a, b));
--error ER_WRONG_FK_DEF
create table t2(a int not null, b int not null, c int not null, primary key (a),
foreign key fk_bug26104 (b,c) references t1(a));
drop table t1;

#
# Bug#15130:CREATE .. SELECT was denied to use advantages of the SQL_BIG_RESULT.
#
create table t1(f1 int,f2 int);
insert into t1 value(1,1),(1,2),(1,3),(2,1),(2,2),(2,3);
flush status;
create table t2 select sql_big_result f1,count(f2) from t1 group by f1;
show status like 'handler_read%';
drop table t1,t2;

#
# Bug #25162: Backing up DB from 5.1 adds 'USING BTREE' to KEYs on table creates
#

# Show that the old syntax for index type is supported
CREATE TABLE t1(c1 VARCHAR(33), KEY USING BTREE (c1));
DROP TABLE t1;

# Show that the new syntax for index type is supported
CREATE TABLE t1(c1 VARCHAR(33), KEY (c1) USING BTREE);
DROP TABLE t1;

# Show that in case of multiple index type definitions, the last one takes 
# precedence

CREATE TABLE t1(c1 VARCHAR(33), KEY USING BTREE (c1) USING HASH) ENGINE=MEMORY;
SHOW INDEX FROM t1;
DROP TABLE t1;

CREATE TABLE t1(c1 VARCHAR(33), KEY USING HASH (c1) USING BTREE) ENGINE=MEMORY;
SHOW INDEX FROM t1;
DROP TABLE t1;

#
# Bug#35924 DEFINER should be stored 'quoted' in I_S
#
--error ER_UNKNOWN_ERROR
create user mysqltest_1@'test@test';

#
# Bug#38821: Assert table->auto_increment_field_not_null failed in open_table()
#
CREATE TABLE t1 (a INTEGER AUTO_INCREMENT PRIMARY KEY, b INTEGER NOT NULL);
INSERT IGNORE INTO t1 (b) VALUES (5);

CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
  SELECT a FROM t1;
--error 1062
INSERT INTO t2 SELECT a FROM t1;
--error 1062
INSERT INTO t2 SELECT a FROM t1;

DROP TABLE t1, t2;

--echo #
--echo # BUG#46384 - mysqld segfault when trying to create table with same 
--echo #             name as existing view
--echo #

CREATE TABLE t1 (a INT);
CREATE TABLE t2 (a INT);

INSERT INTO t1 VALUES (1),(2),(3);
INSERT INTO t2 VALUES (1),(2),(3);

CREATE VIEW v1 AS SELECT t1.a FROM t1, t2;
--error ER_TABLE_EXISTS_ERROR
CREATE TABLE v1 AS SELECT * FROM t1;

DROP VIEW v1;
DROP TABLE t1,t2;

--echo End of 5.0 tests

#
# Test of behaviour with CREATE ... SELECT
#

CREATE TABLE t1 (a int, b int);
insert into t1 values (1,1),(1,2);
--error ER_DUP_ENTRY
CREATE TABLE t2 (primary key (a)) select * from t1;
# This should give warning
drop table if exists t2;
--error ER_DUP_ENTRY
CREATE TEMPORARY TABLE t2 (primary key (a)) select * from t1;
# This should give warning
drop table if exists t2;
CREATE TABLE t2 (a int, b int, primary key (a));
--error ER_DUP_ENTRY
INSERT INTO t2 select * from t1;
SELECT * from t2;
TRUNCATE table t2;
--error ER_DUP_ENTRY
INSERT INTO t2 select * from t1;
SELECT * from t2;
drop table t2;

CREATE TEMPORARY TABLE t2 (a int, b int, primary key (a));
--error ER_DUP_ENTRY
INSERT INTO t2 SELECT * FROM t1;
SELECT * from t2;
drop table t1,t2;


#
# Test incorrect database names
#

--error 1102
CREATE DATABASE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
--error 1102
DROP DATABASE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;

# TODO: enable these tests when RENAME DATABASE is implemented.
# --error 1049
# RENAME DATABASE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa TO a;
# --error 1102
# RENAME DATABASE mysqltest TO aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
# create database mysqltest;
# --error 1102
# RENAME DATABASE mysqltest TO aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
# drop database mysqltest;

--error 1102
USE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
--error 1102
SHOW CREATE DATABASE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;

#
# Bug#21432 Database/Table name limited to 64 bytes, not chars, problems with multi-byte
#
set names utf8;

# MXS: create database имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
# MXS: qc_get_type              : ERR: QUERY_TYPE_WRITE != QUERY_TYPE_WRITE|QUERY_TYPE_COMMIT
# MXS: qc_get_operation         : ERR: QUERY_OP_UNDEFINED != QUERY_OP_CREATE
# MXS: qc_mysqlembedded sees the type as SQLCOM_END when figuring out the type.
use имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
select database();
use test;

select SCHEMA_NAME from information_schema.schemata
where schema_name='имя_базы_в_кодировке_утф8_длиной_больше_чем_45';

drop database имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
# MXS: create table имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48
# MXS: (
# MXS:   имя_поля_в_кодировке_утф8_длиной_больше_чем_45 int,
# MXS:   index имя_индекса_в_кодировке_утф8_длиной_больше_чем_48 (имя_поля_в_кодировке_утф8_длиной_больше_чем_45)
# MXS: );
# MXS: qc_get_created_table_name: ERR: Ð != имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48
# MXS: qc_get_table_names       : ERR: Ð != имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48


# MXS: create view имя_вью_кодировке_утф8_длиной_больше_чем_42 as
# MXS: select имя_поля_в_кодировке_утф8_длиной_больше_чем_45
# MXS: from имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48;
# MXS: qc_get_table_names       : ERR: Ð != имя_вью_кодировке_утф8_длиной_больше_чем_42, имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48
# MXS: qc_get_affected_fields   : ERR:  != имя_поля_в_кодировке_утф8_длиной_больше_чем_45


# database, table, field, key, view
# MXS: select * from имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48;
# MXS: qc_get_type              : ERR: QUERY_TYPE_WRITE != QUERY_TYPE_READ
# MXS: qc_get_operation         : ERR: QUERY_OP_UNDEFINED != QUERY_OP_SELECT
# MXS: qc_is_real_query         : ERR: 0 != 1
# MXS: qc_get_table_names       : ERR: NULL != имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48

select TABLE_NAME from information_schema.tables where
table_schema='test';

select COLUMN_NAME from information_schema.columns where
table_schema='test';

select INDEX_NAME from information_schema.statistics where
table_schema='test';

select TABLE_NAME from information_schema.views where
table_schema='test';

# MXS: show create table имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48;
# MXS: qc_get_table_names       : ERR: Ð != имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48
# MXS: show create view имя_вью_кодировке_утф8_длиной_больше_чем_42;
# MXS: qc_get_table_names       : ERR: Ð != имя_вью_кодировке_утф8_длиной_больше_чем_42

# MXS: create trigger имя_триггера_в_кодировке_утф8_длиной_больше_чем_49
# MXS: before insert on имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48 for each row set @a:=1;
# MXS: qc_get_type              : ERR: QUERY_TYPE_WRITE != QUERY_TYPE_WRITE|QUERY_TYPE_COMMIT
# MXS: qc_get_operation         : ERR: QUERY_OP_UNDEFINED != QUERY_OP_CREATE
# MXS: qc_get_table_names       : ERR: NULL != имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48

select TRIGGER_NAME from information_schema.triggers where
trigger_schema='test';
drop trigger имя_триггера_в_кодировке_утф8_длиной_больше_чем_49;
--error 1059
create trigger
очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_66
before insert on имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48 for each row set @a:=1;
--error 1059
drop trigger очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_66;

# MXS: create procedure имя_процедуры_в_кодировке_утф8_длиной_больше_чем_50()
# MXS: begin
# MXS: end;
# MXS: qc_get_type              : ERR: QUERY_TYPE_WRITE != QUERY_TYPE_WRITE|QUERY_TYPE_COMMIT
# MXS: qc_get_operation         : ERR: QUERY_OP_UNDEFINED != QUERY_OP_CREATE

select ROUTINE_NAME from information_schema.routines where
routine_schema='test';
drop procedure имя_процедуры_в_кодировке_утф8_длиной_больше_чем_50;
--error 1059
create procedure очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_66()
begin
end;

# MXS: create function имя_функции_в_кодировке_утф8_длиной_больше_чем_49()
# MXS:   returns int
# MXS: return 0;
# MXS: qc_get_type              : ERR: QUERY_TYPE_WRITE != QUERY_TYPE_WRITE|QUERY_TYPE_COMMIT
# MXS: qc_get_operation         : ERR: QUERY_OP_UNDEFINED != QUERY_OP_CREATE

select ROUTINE_NAME from information_schema.routines where
routine_schema='test';
drop function имя_функции_в_кодировке_утф8_длиной_больше_чем_49;
--error 1059
create function очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_66()
   returns int
return 0;

# MXS: drop view имя_вью_кодировке_утф8_длиной_больше_чем_42;
# MXS: qc_get_table_names       : ERR: Ð != имя_вью_кодировке_утф8_длиной_больше_чем_42
# MXS: drop table имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48;
# MXS: qc_get_table_names       : ERR: Ð != имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48
set names default;

#
# Bug#21136 CREATE TABLE SELECT within CREATE TABLE SELECT causes server crash
#

--disable_warnings
drop table if exists t1,t2,t3;
drop function if exists f1;
--enable_warnings

--delimiter |
create function f1() returns int
begin
  declare res int;
  create temporary table t3 select 1 i;
  set res:= (select count(*) from t1);
  drop temporary table t3;
  return res;
end|
--delimiter ;
create table t1 as select 1;
create table t2 as select f1() from t1;
drop table t1,t2;
drop function f1;

#
# Bug#25629 CREATE TABLE LIKE does not work with INFORMATION_SCHEMA
#
create table t1 like information_schema.processlist;
--replace_result ENGINE=MyISAM "" ENGINE=Aria "" " PAGE_CHECKSUM=1" "" " PAGE_CHECKSUM=0" ""
show create table t1;
drop table t1;
create temporary table t1 like information_schema.processlist;
--replace_result ENGINE=MyISAM "" ENGINE=Aria "" " PAGE_CHECKSUM=1" "" " PAGE_CHECKSUM=0" ""
show create table t1;
drop table t1;
create table t1 like information_schema.character_sets;
show create table t1;
drop table t1;

###########################################################################

--echo
--echo # --
--echo # -- Bug#18834: ALTER TABLE ADD INDEX on table with two timestamp fields
--echo # --
--echo

--disable_warnings
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
DROP TABLE IF EXISTS t3;
--enable_warnings

--echo

CREATE TABLE t1(c1 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, c2 TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00');

--echo

SET sql_mode = NO_ZERO_DATE;

--echo
--error ER_INVALID_DEFAULT
CREATE TABLE t2(c1 TIMESTAMP, c2 TIMESTAMP DEFAULT 0);

--echo
--error ER_INVALID_DEFAULT
CREATE TABLE t2(c1 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, c2 TIMESTAMP NOT NULL);

--echo
--echo # -- Check that NULL column still can be created.
CREATE TABLE t2(c1 TIMESTAMP NULL);

--echo
--echo # -- Check ALTER TABLE.
--error ER_INVALID_DEFAULT
ALTER TABLE t1 ADD INDEX(c1);

--echo
--echo # -- Check DATETIME.
SET sql_mode = '';

--echo

CREATE TABLE t3(c1 DATETIME NOT NULL);
INSERT INTO t3 VALUES (0);

--echo
SET sql_mode = TRADITIONAL;

--echo
--error ER_TRUNCATED_WRONG_VALUE
ALTER TABLE t3 ADD INDEX(c1);

--echo
--echo # -- Cleanup.

SET sql_mode = '';
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;

--echo
--echo # -- End of Bug#18834.

###########################################################################

--echo
--echo # --
--echo # -- Bug#34274: Invalid handling of 'DEFAULT 0' for YEAR data type.
--echo # --
--echo

--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings

--echo
CREATE TABLE t1(c1 YEAR DEFAULT 2008, c2 YEAR DEFAULT 0);

--echo
SHOW CREATE TABLE t1;

--echo
INSERT INTO t1 VALUES();

--echo
SELECT * FROM t1;

--echo
ALTER TABLE t1 MODIFY c1 YEAR DEFAULT 0;

--echo
SHOW CREATE TABLE t1;

--echo
INSERT INTO t1 VALUES();

--echo
SELECT * FROM t1;

--echo
DROP TABLE t1;

--echo
--echo # -- End of Bug#34274

###########################################################################

#
# Bug#40104 regression with table names?
#
create table `me:i`(id int);
drop table `me:i`;

###########################################################################

#
# Bug#45829 CREATE TABLE TRANSACTIONAL PAGE_CHECKSUM ROW_FORMAT=PAGE accepted, does nothing
#

--echo
--echo # --
--echo # -- Bug#45829: CREATE TABLE TRANSACTIONAL PAGE_CHECKSUM ROW_FORMAT=PAGE accepted, does nothing
--echo # --
--echo

--disable_warnings
drop table if exists t1,t2,t3;
--enable_warnings
--echo # Fix modified for MariaDB: we support this syntax
create table t1 (a int) transactional=0;
create table t2 (a int) page_checksum=1;
create table t3 (a int) row_format=page;
drop table t1,t2,t3;
--echo
--echo # -- End of Bug#45829

#
# new table creation/renaming is NOT blocked if old encoded table present
#
let $MYSQLD_DATADIR= `select @@datadir`;
create table `#mysql50#t-1` (a int) engine=myisam;
insert into `#mysql50#t-1` values (1);
show tables;
create table `t-1` (a int);
show tables;
# selects can distinguish between the two tables
select * from `t-1`;
select * from `#mysql50#t-1`;
drop table `t-1`;
create table t1 (a int);
alter table t1 rename `t-1`;
show tables;
drop table `t-1`;
create table t1 (a int);
rename table t1 to `t-1`;
show tables;
drop table `#mysql50#t-1`, `t-1`;

--echo
--echo End of 5.1 tests


###########################################################################

--echo
--echo # --
--echo # -- Bug #43054 	Assertion `!table->auto_increment_field_not_null' 
--echo # --       failed when redefining trigger
--echo

#--disable_abort_on_error

CREATE TABLE B (
  pk INTEGER AUTO_INCREMENT,
  int_key INTEGER NOT NULL,
  PRIMARY KEY (pk),
  KEY (int_key)
);

INSERT IGNORE INTO B VALUES ('9', '9');

CREATE TABLE IF NOT EXISTS t1 ( 
  `pk` INTEGER NOT NULL AUTO_INCREMENT , 
  `int` INTEGER ,
   PRIMARY KEY ( `pk` ) 
) SELECT `pk` , `int_key` FROM B ;

--delimiter |

CREATE TRIGGER f BEFORE INSERT ON t1 FOR EACH ROW 
BEGIN 
  INSERT INTO t1 ( `int` ) VALUES (4 ),( 8 ),( 2 ) ; 
END ; |

--delimiter ;
--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG
INSERT INTO t1 (pk, int_key) SELECT `pk` , `int_key` FROM B ;

--delimiter |
--error ER_TRG_ALREADY_EXISTS
CREATE TRIGGER f BEFORE INSERT ON t1 FOR EACH ROW 
BEGIN 
  UPDATE A SET `pk`=1 WHERE `pk`=0 ; 
END ;|

--error ER_NOT_SUPPORTED_YET
CREATE TRIGGER f1 BEFORE INSERT ON t1 FOR EACH ROW 
BEGIN 
  UPDATE A SET `pk`=1 WHERE `pk`=0 ; 
END ;|

--delimiter ;

DROP TABLE t1;
DROP TABLE B;

--echo #
--echo # Bug #47107 assert in notify_shared_lock on incorrect 
--echo #            CREATE TABLE , HANDLER
--echo #

--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings

CREATE TABLE t1(f1 integer);

--echo # The following CREATE TABLEs before gave an assert.

HANDLER t1 OPEN AS A;
--error ER_TABLE_EXISTS_ERROR
CREATE TABLE t1 SELECT 1 AS f2;

HANDLER t1 OPEN AS A;
--error ER_TABLE_EXISTS_ERROR
CREATE TABLE t1(f1 integer);

CREATE TABLE t2(f1 integer);
HANDLER t1 OPEN AS A;
--error ER_TABLE_EXISTS_ERROR
CREATE TABLE t1 LIKE t2;

DROP TABLE t2;
DROP TABLE t1;

--echo #
--echo # Bug #48800 CREATE TABLE t...SELECT fails if t is a 
--echo #            temporary table
--echo #

CREATE TEMPORARY TABLE t1 (a INT);
CREATE TABLE t1 (a INT);

CREATE TEMPORARY TABLE t2 (a INT);
CREATE VIEW t2 AS SELECT 1;

CREATE TABLE t3 (a INT);
CREATE TEMPORARY TABLE t3 SELECT 1; 

CREATE TEMPORARY TABLE t4 (a INT);
CREATE TABLE t4 AS SELECT 1;

DROP TEMPORARY TABLE t1, t2, t3, t4;
DROP TABLE t1, t3, t4;
DROP VIEW t2;

--echo #
--echo # Bug #49193 CREATE TABLE reacts differently depending 
--echo #            on whether data is selected or not
--echo #

CREATE TEMPORARY TABLE t2 (ID INT);
INSERT INTO t2 VALUES (1),(2),(3);

# Case 1 -- did not fail
CREATE TEMPORARY TABLE t1 (ID INT);
CREATE TABLE IF NOT EXISTS t1 (ID INT);
INSERT INTO t1 SELECT * FROM t2;
SELECT * FROM t1;
DROP TEMPORARY TABLE t1;
SELECT * FROM t1;

DROP TABLE t1;

# Case 2 -- The DROP TABLE t1 failed with 
#  Table 'test.t1' doesn't exist in the SELECT *
# as the (permanent) table was not created
CREATE TEMPORARY TABLE t1 (ID INT);
CREATE TABLE IF NOT EXISTS t1 SELECT * FROM t2;
SELECT * FROM t1;
DROP TEMPORARY TABLE t1;
SELECT * FROM t1;

DROP TABLE t1;

# Case 3 -- The CREATE TABLE failed with
#  Table 't1' already exists
CREATE TEMPORARY TABLE t1 (ID INT);
CREATE TABLE t1 SELECT * FROM t2;
SELECT * FROM t1;
DROP TEMPORARY TABLE t1;
SELECT * FROM t1;
 
DROP TABLE t1;
 
DROP TEMPORARY TABLE t2;


--echo # 
--echo # Bug #22909 "Using CREATE ... LIKE is possible to create field
--echo #             with invalid default value"
--echo #
--echo # Altough original bug report suggests to use older version of MySQL
--echo # for producing .FRM with invalid defaults we use sql_mode to achieve
--echo # the same effect.
--disable_warnings
drop tables if exists t1, t2;
--enable_warnings
--echo # Attempt to create table with invalid default should fail in normal mode
--error ER_INVALID_DEFAULT
create table t1 (dt datetime default '2008-02-31 00:00:00');
set @old_mode= @@sql_mode;
set @@sql_mode='ALLOW_INVALID_DATES';
--echo # The same should be possible in relaxed mode
create table t1 (dt datetime default '2008-02-31 00:00:00');
set @@sql_mode= @old_mode;
--echo # In normal mode attempt to create copy of table with invalid
--echo # default should fail
--error ER_INVALID_DEFAULT
create table t2 like t1;
set @@sql_mode='ALLOW_INVALID_DATES';
--echo # But should work in relaxed mode
create table t2 like t1;
--echo # Check that table definitions match
show create table t1;
show create table t2;
set @@sql_mode= @old_mode;
drop tables t1, t2;
#
# Bug#47132 CREATE TABLE.. SELECT.. data not inserted if table
# is view over multiple tables
#

CREATE TABLE t1 (id int);
CREATE TABLE t2 (id int);
INSERT INTO t1 VALUES (1), (1);
INSERT INTO t2 VALUES (2), (2);

CREATE VIEW v1 AS SELECT id FROM t2;
CREATE TABLE IF NOT EXISTS v1(a int, b int) SELECT id, id as di FROM t1;
SHOW CREATE TABLE v1;
SELECT * FROM t2;
SELECT * FROM v1;
DROP VIEW v1;

CREATE TEMPORARY TABLE tt1 AS SELECT id FROM t2;
CREATE TEMPORARY TABLE IF NOT EXISTS tt1(a int, b int) SELECT id, id FROM t1;
SELECT * FROM t2;
SELECT * FROM tt1;
DROP TEMPORARY TABLE tt1;

DROP TABLE t1, t2;


--echo #
--echo # WL#5370 "Changing 'CREATE TABLE IF NOT EXISTS ... SELECT'
--echo # behaviour.
--echo # 

--echo #
--echo # 1. Basic case: a base table.
--echo # 

create table if not exists t1 (a int) select 1 as a;
select * from t1;
--error ER_TABLE_EXISTS_ERROR
create table t1 (a int) select 2 as a;
select * from t1;
--echo # Produces an essential warning ER_TABLE_EXISTS.
create table if not exists t1 (a int) select 2 as a;
--echo # No new data in t1.
select * from t1;
drop table t1;

--echo # 
--echo # 2. A temporary table.
--echo #

create temporary table if not exists t1 (a int) select 1 as a;
select * from t1;
--error ER_TABLE_EXISTS_ERROR
create temporary table t1 (a int) select 2 as a;
select * from t1;
--echo # An essential warning.
create temporary table if not exists t1 (a int) select 2 as a;
--echo # No new data in t1.
select * from t1;
drop temporary table t1;

--echo # 
--echo # 3. Creating a base table in presence of a temporary table.
--echo #

create table t1 (a int);
--echo # Create a view for convenience of querying t1 shadowed by a temp.
create view v1 as select a from t1;
drop table t1;
create temporary table t1 (a int) select 1 as a;
create table if not exists t1 (a int) select 2 as a;
select * from t1;
select * from v1;
--echo # Note: an essential warning.
create table if not exists t1 (a int) select 3 as a;
select * from t1;
select * from v1;
drop temporary table t1;
select * from t1;
drop view v1;
drop table t1;

--echo # 
--echo # 4. Creating a temporary table in presence of a base table.
--echo #

create table t1 (a int) select 1 as a;
create temporary table if not exists t1 select 2 as a;
select * from t1;
--echo # Note: an essential warning.
create temporary table if not exists t1 select 3 as a;
select * from t1;
drop temporary table t1;
select * from t1;
drop table t1;

--echo #
--echo # 5. Creating a base table in presence of an updatable view.
--echo # 
create table t2 (a int unique);
create view t1 as select a from t2;
insert into t1 (a) values (1);
--error ER_TABLE_EXISTS_ERROR
create table t1 (a int);
--echo # Note: an essential warning.
create table if not exists t1 (a int);
--error ER_TABLE_EXISTS_ERROR
create table t1 (a int) select 2 as a;
select * from t1;
--echo # Note: an essential warning.
create table if not exists t1 (a int) select 2 as a;
select * from t1;
select * from t2;
create temporary table if not exists t1 (a int) select 3 as a;
select * from t1;
select * from t2;
--echo # Note: an essential warning.
create temporary table if not exists t1 (a int) select 4 as a;
select * from t1;
select * from t2;
drop temporary table t1;

--echo #
--echo # Repeating the test with a non-updatable view.
--echo #
drop view t1;
create view t1 as select a + 5 as a from t2;
--error ER_NON_INSERTABLE_TABLE
insert into t1 (a) values (1);
--error ER_NONUPDATEABLE_COLUMN
update t1 set a=3 where a=2;

--error ER_TABLE_EXISTS_ERROR
create table t1 (a int);
--echo # Note: an essential warning.
create table if not exists t1 (a int);
--error ER_TABLE_EXISTS_ERROR
create table t1 (a int) select 2 as a;
select * from t1;
--echo # Note: an essential warning.
create table if not exists t1 (a int) select 2 as a;
select * from t1;
select * from t2;
create temporary table if not exists t1 (a int) select 3 as a;
select * from t1;
select * from t2;
--echo # Note: an essential warning.
create temporary table if not exists t1 (a int) select 4 as a;
select * from t1;
select * from t2;
drop temporary table t1;
drop view t1;
drop table t2;

--echo #
--echo # Repeating the test with a view select a constant number
--echo #
create view t1 as select 1 as a;
--error ER_NON_INSERTABLE_TABLE
insert into t1 (a) values (1);
--error ER_NON_UPDATABLE_TABLE
update t1 set a=3 where a=2;

--error ER_TABLE_EXISTS_ERROR
create table t1 (a int);
--echo # Note: an essential warning.
create table if not exists t1 (a int);
--error ER_TABLE_EXISTS_ERROR
create table t1 (a int) select 2 as a;
select * from t1;
--echo # Note: an essential warning.
create table if not exists t1 (a int) select 2 as a;
select * from t1;
create temporary table if not exists t1 (a int) select 3 as a;
select * from t1;
--echo # Note: an essential warning.
create temporary table if not exists t1 (a int) select 4 as a;
select * from t1;
drop temporary table t1;
drop view t1;


--echo #
--echo # 6. Test of unique_table().
--echo #

create table t1 (a int) select 1 as a;
create temporary table if not exists t1 (a int) select * from t1;
--error ER_CANT_REOPEN_TABLE
create temporary table if not exists t1 (a int) select * from t1;
select * from t1;
drop temporary table t1;
select * from t1;
drop table t1;
create temporary table t1 (a int) select 1 as a;
create table if not exists t1 (a int) select * from t1;
create table if not exists t1 (a int) select * from t1;
select * from t1;
drop temporary table t1;
select * from t1;
drop table t1;
--error ER_NO_SUCH_TABLE
create table if not exists t1 (a int) select * from t1;

--echo #
--echo # 7. Test of non-matching columns, REPLACE and IGNORE.
--echo #

create table t1 (a int) select 1 as b, 2 as c;
select * from t1;
drop table t1;
create table if not exists t1 (a int, b date, c date) select 1 as b, 2 as c;
select * from t1;
drop table t1;
set @@session.sql_mode='STRICT_ALL_TABLES';
--error ER_TRUNCATED_WRONG_VALUE
create table if not exists t1 (a int, b date, c date) select 1 as b, 2 as c;
--error ER_NO_SUCH_TABLE
select * from t1;
--error ER_TRUNCATED_WRONG_VALUE
create table if not exists t1 (a int, b date, c date) 
  replace select 1 as b, 2 as c;
--error ER_NO_SUCH_TABLE
select * from t1;

create table if not exists t1 (a int, b date, c date) 
  ignore select 1 as b, 2 as c;
select * from t1;
set @@session.sql_mode=default;
drop table t1;

create table if not exists t1 (a int unique, b int)
  replace select 1 as a, 1 as b union select 1 as a, 2 as b;
select * from t1;
drop table t1;
create table if not exists t1 (a int unique, b int)
  ignore select 1 as a, 1 as b union select 1 as a, 2 as b;
select * from t1;
drop table t1;

--echo #
--echo # Checking that CREATE IF NOT EXISTS is not blocked by running SELECT
--echo #

create table t1 (a int, b int) engine=myisam;
create table t2 (a int, b int) engine=myisam;
insert into t1 values (1,1);
lock tables t1 read;
connect (user1,localhost,root,,test);
set @@lock_wait_timeout=5;
create table if not exists t1 (a int, b int);
create table if not exists t1 (a int, b int) select 2,2;
create table if not exists t1 like t2;
--error ER_TABLE_EXISTS_ERROR
create table t1 (a int, b int);
--error ER_TABLE_EXISTS_ERROR
create table t1 (a int, b int) select 2,2;
--error ER_TABLE_EXISTS_ERROR
create table t1 like t2;
--error ER_LOCK_WAIT_TIMEOUT
create or replace table t1 (a int, b int) select 2,2;
disconnect user1;
connection default;
select * from t1;
unlock tables;
drop table t1,t2;

--echo #
--echo # MDEV-6179: dynamic columns functions/cast()/convert() doesn't
--echo # play nice with CREATE/ALTER TABLE
--echo #
create table t1 (
  color char(32) as (COLUMN_GET(dynamic_cols, 1 as char)) persistent,
  cl char(32) as (COLUMN_GET(COLUMN_ADD(COLUMN_CREATE(1 , 'blue' as char), 2, 'ttt'), i as char)) persistent,
  item_name varchar(32) primary key,
  i int,
  dynamic_cols  blob
);
INSERT INTO t1(item_name, dynamic_cols, i) VALUES 
  ('MariaDB T-shirt', COLUMN_CREATE(1, 'blue', 2, 'XL'), 1);
INSERT INTO t1(item_name, dynamic_cols, i) VALUES
  ('Thinkpad Laptop', COLUMN_CREATE(1, 'black', 3, 500), 2);

select item_name, color, cl from t1;
show create table t1;

drop table t1;

create table t1 (
  n int,
  c char(32) as (convert(cast(n as char), char)) persistent
);
insert into t1(n) values (1),(2),(3);

select * from t1;
show create table t1;

drop table t1;

#
# MDEV-7050: MySQL#74603 - Assertion `comma_length > 0' failed in mysql_prepare_create_table
#
set @@session.collation_server=filename;
create table t1(a enum('',''));
drop table t1;
set @@session.collation_server=default;

--echo #
--echo # MDEV-7765: Crash (Assertion `!table || (!table->write_set ||
--echo # bitmap_is_set(table->write_set, field_index) ||
--echo # bitmap_is_set(table->vcol_set, field_index))' fails)
--echo # on using function over not created table
--echo #

DELIMITER |;
CREATE function f1() returns int
BEGIN
  declare n int;
  set n:= (select count(*) from t1);
  return n;
end|
DELIMITER ;|
-- error ER_NO_SUCH_TABLE
create table t1 as select f1();
drop function f1;

--echo End of 5.5 tests

#
# MDEV-4880 Attempt to create a table without columns produces ER_ILLEGAL_HA instead of ER_TABLE_MUST_HAVE_COLUMNS
#
--error ER_TABLE_MUST_HAVE_COLUMNS
create table t1;
