#--disable_abort_on_error
#
# Simple test for the partition storage engine
# Focuses on range partitioning tests
# 
-- source include/have_partition.inc

--disable_warnings
drop table if exists t1;
--enable_warnings

#
# Partition by range, basic
#
CREATE TABLE t1 (
a int not null,
b int not null,
c int not null,
primary key(a,b))
partition by range (a)
partitions 3
(partition x1 values less than (5) tablespace ts1,
 partition x2 values less than (10) tablespace ts2,
 partition x3 values less than maxvalue tablespace ts3);

# Simple insert and verify test
INSERT into t1 values (1, 1, 1);
INSERT into t1 values (6, 1, 1);
INSERT into t1 values (10, 1, 1);
INSERT into t1 values (15, 1, 1);

select * from t1;
show create table t1;

ALTER TABLE t1
partition by range (a)
partitions 3
(partition x1 values less than (5) tablespace ts1,
 partition x2 values less than (10) tablespace ts2,
 partition x3 values less than maxvalue tablespace ts3);

select * from t1;
show create table t1;

drop table if exists t1;

#
# Partition by range, basic
# No primary key
#
CREATE TABLE t1 (
a int not null,
b int not null,
c int not null)
partition by range (a)
partitions 3
(partition x1 values less than (5) tablespace ts1,
 partition x2 values less than (10) tablespace ts2,
 partition x3 values less than maxvalue tablespace ts3);

# Simple insert and verify test
INSERT into t1 values (1, 1, 1);
INSERT into t1 values (6, 1, 1);
INSERT into t1 values (10, 1, 1);
INSERT into t1 values (15, 1, 1);

select * from t1;

ALTER TABLE t1
partition by range (a)
partitions 3
(partition x1 values less than (5) tablespace ts1,
 partition x2 values less than (10) tablespace ts2,
 partition x3 values less than maxvalue tablespace ts3);

select * from t1;

drop table if exists t1;

#
# Partition by range, basic
# No max value used
#
CREATE TABLE t1 (
a int not null,
b int not null,
c int not null,
primary key(a,b))
partition by range (a)
partitions 3
(partition x1 values less than (5) tablespace ts1,
 partition x2 values less than (10) tablespace ts2,
 partition x3 values less than (15) tablespace ts3);


# Simple insert and verify test
INSERT into t1 values (1, 1, 1);
INSERT into t1 values (6, 1, 1);
INSERT into t1 values (10, 1, 1);
--error ER_NO_PARTITION_FOR_GIVEN_VALUE
INSERT into t1 values (15, 1, 1);

select * from t1;

ALTER TABLE t1
partition by range (a)
partitions 3
(partition x1 values less than (5) tablespace ts1,
 partition x2 values less than (10) tablespace ts2,
 partition x3 values less than (15) tablespace ts3);

select * from t1;

drop table t1;

#
# Partition by range, only one partition
#
CREATE TABLE t1 (
a int not null,
b int not null,
c int not null,
primary key(a,b))
partition by range (a)
(partition x1 values less than (1));

drop table t1;

#
# Subpartition by hash, two partitions and two subpartitions
#
CREATE TABLE t1 (
a int not null,
b int not null,
c int not null,
primary key (a,b)) 
partition by range (a)
subpartition by hash (a+b) 
( partition x1 values less than (1)
  ( subpartition x11,
    subpartition x12),
   partition x2 values less than (5)
   ( subpartition x21,
     subpartition x22)
);

SELECT * from t1;
show create table t1;

ALTER TABLE t1 ADD COLUMN d int;
show create table t1;

drop table t1;

#
# Subpartition by hash, two partitions and two subpartitions
# Defined tablespace, engine and node group
#
CREATE TABLE t1 (
a int not null,
b int not null,
c int not null,
primary key (a,b))
partition by range (a)
subpartition by hash (a+b)
( partition x1 values less than (1)
  ( subpartition x11 tablespace t1 engine myisam nodegroup 0,
    subpartition x12 tablespace t2 engine myisam nodegroup 1),
   partition x2 values less than (5)
   ( subpartition x21 tablespace t1 engine myisam nodegroup 0,
     subpartition x22 tablespace t2 engine myisam nodegroup 1)
);

SELECT * from t1;

drop table t1;

#
# Subpartition by hash, two partitions and two subpartitions
# Defined tablespace, node group
#
CREATE TABLE t1 (
a int not null,
b int not null,
c int not null,
primary key (a,b))
partition by range (a)
subpartition by hash (a+b)
( partition x1 values less than (1)
  ( subpartition x11 tablespace t1 nodegroup 0,
    subpartition x12 tablespace t2 nodegroup 1),
   partition x2 values less than (5)
   ( subpartition x21 tablespace t1 nodegroup 0,
     subpartition x22 tablespace t2 nodegroup 1)
);

SELECT * from t1;

drop table t1;

#
# Subpartition by hash, two partitions and two subpartitions
# Defined engine and node group
#
CREATE TABLE t1 (
a int not null,
b int not null,
c int not null,
primary key (a,b))
partition by range (a)
subpartition by hash (a+b)
( partition x1 values less than (1)
  ( subpartition x11 engine myisam nodegroup 0,
    subpartition x12 engine myisam nodegroup 1),
   partition x2 values less than (5)
   ( subpartition x21 engine myisam nodegroup 0,
     subpartition x22 engine myisam nodegroup 1)
);

INSERT into t1 VALUES (1,1,1);
INSERT into t1 VALUES (4,1,1);
--error ER_NO_PARTITION_FOR_GIVEN_VALUE
INSERT into t1 VALUES (5,1,1);

SELECT * from t1;

ALTER TABLE t1
partition by range (a)
subpartition by hash (a+b)
( partition x1 values less than (1)
  ( subpartition x11 engine myisam nodegroup 0,
    subpartition x12 engine myisam nodegroup 1),
   partition x2 values less than (5)
   ( subpartition x21 engine myisam nodegroup 0,
     subpartition x22 engine myisam nodegroup 1)
);

SELECT * from t1;

drop table t1;

#
# Subpartition by hash, two partitions and two subpartitions
# Defined tablespace, engine
#
CREATE TABLE t1 (
a int not null,
b int not null,
c int not null,
primary key (a,b))
partition by range (a)
subpartition by hash (a+b)
( partition x1 values less than (1)
  ( subpartition x11 tablespace t1 engine myisam,
    subpartition x12 tablespace t2 engine myisam),
  partition x2 values less than (5)
  ( subpartition x21 tablespace t1 engine myisam,
    subpartition x22 tablespace t2 engine myisam)
);

INSERT into t1 VALUES (1,1,1);
INSERT into t1 VALUES (4,1,1);
--error ER_NO_PARTITION_FOR_GIVEN_VALUE
INSERT into t1 VALUES (5,1,1);

SELECT * from t1;

ALTER TABLE t1
partition by range (a)
subpartition by hash (a+b)
( partition x1 values less than (1)
  ( subpartition x11 tablespace t1 engine myisam,
    subpartition x12 tablespace t2 engine myisam),
  partition x2 values less than (5)
  ( subpartition x21 tablespace t1 engine myisam,
    subpartition x22 tablespace t2 engine myisam)
);

SELECT * from t1;

drop table t1;

#
# Subpartition by hash, two partitions and two subpartitions
# Defined tablespace
#
CREATE TABLE t1 (
a int not null,
b int not null,
c int not null,
primary key (a,b))
partition by range (a)
subpartition by hash (a+b)
( partition x1 values less than (1)
  ( subpartition x11 tablespace t1,
    subpartition x12 tablespace t2),
   partition x2 values less than (5)
  ( subpartition x21 tablespace t1,
    subpartition x22 tablespace t2)
);

INSERT into t1 VALUES (1,1,1);
INSERT into t1 VALUES (4,1,1);
--error ER_NO_PARTITION_FOR_GIVEN_VALUE
INSERT into t1 VALUES (5,1,1);

SELECT * from t1;

ALTER TABLE t1
partition by range (a)
subpartition by hash (a+b)
( partition x1 values less than (1)
  ( subpartition x11 tablespace t1 engine myisam,
    subpartition x12 tablespace t2 engine myisam),
  partition x2 values less than (5)
  ( subpartition x21 tablespace t1 engine myisam,
    subpartition x22 tablespace t2 engine myisam)
);

SELECT * from t1;

drop table t1;

#
# Subpartition by hash, two partitions and two subpartitions
# Defined engine
#
CREATE TABLE t1 (
a int not null,
b int not null,
c int not null,
primary key (a,b))
partition by range (a)
subpartition by hash (a+b)
( partition x1 values less than (1)
  ( subpartition x11 engine myisam,
    subpartition x12 engine myisam),
  partition x2 values less than (5)
  ( subpartition x21 engine myisam,
    subpartition x22 engine myisam)
);

INSERT into t1 VALUES (1,1,1);
INSERT into t1 VALUES (4,1,1);
--error ER_NO_PARTITION_FOR_GIVEN_VALUE
INSERT into t1 VALUES (5,1,1);

SELECT * from t1;

ALTER TABLE t1
partition by range (a)
subpartition by hash (a+b)
( partition x1 values less than (1)
  ( subpartition x11 engine myisam,
    subpartition x12 engine myisam),
  partition x2 values less than (5)
  ( subpartition x21 engine myisam,
    subpartition x22 engine myisam)
);

SELECT * from t1;

drop table t1;
