DROP SCHEMA hw_subpartition_tablespace CASCADE;
CREATE SCHEMA hw_subpartition_tablespace;
SET CURRENT_SCHEMA TO hw_subpartition_tablespace;

--prepare
\! rm -fr '@testtablespace@/hw_subpartition_tablespace_ts1'
\! mkdir '@testtablespace@/hw_subpartition_tablespace_ts1'
\! rm -fr '@testtablespace@/hw_subpartition_tablespace_ts2'
\! mkdir '@testtablespace@/hw_subpartition_tablespace_ts2'
\! rm -fr '@testtablespace@/hw_subpartition_tablespace_ts3'
\! mkdir '@testtablespace@/hw_subpartition_tablespace_ts3'
CREATE TABLESPACE hw_subpartition_tablespace_ts1 LOCATION '@testtablespace@/hw_subpartition_tablespace_ts1';
CREATE TABLESPACE hw_subpartition_tablespace_ts2 LOCATION '@testtablespace@/hw_subpartition_tablespace_ts2';
CREATE TABLESPACE hw_subpartition_tablespace_ts3 LOCATION '@testtablespace@/hw_subpartition_tablespace_ts3';

--
----test create subpartition with tablespace----
--
--range-range
CREATE TABLE t_range_range1(c1 int, c2 int, c3 int)
PARTITION BY RANGE (c1) SUBPARTITION BY RANGE (c2)
(
    PARTITION P_RANGE1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_RANGE1_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE1_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE1_3 VALUES LESS THAN (15)
    ),
    PARTITION P_RANGE2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_RANGE2_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE2_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE2_3 VALUES LESS THAN (15)
    ),
    PARTITION P_RANGE3 VALUES LESS THAN (15)
    (
        SUBPARTITION P_RANGE3_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE3_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE3_3 VALUES LESS THAN (15)
    ),
    PARTITION P_RANGE4 VALUES LESS THAN (20) TABLESPACE hw_subpartition_tablespace_ts1,
    PARTITION P_RANGE5 VALUES LESS THAN (25)
);
SELECT pg_get_tabledef('t_range_range1');
DROP TABLE t_range_range1;

CREATE TABLE t_range_range2(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY RANGE (c1) SUBPARTITION BY RANGE (c2)
(
    PARTITION P_RANGE1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_RANGE1_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE1_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE1_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE1_4 VALUES LESS THAN (20)
    ),
    PARTITION P_RANGE2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_RANGE2_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE2_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE2_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE2_4 VALUES LESS THAN (20)
    ),
    PARTITION P_RANGE3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_RANGE3_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE3_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE3_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE3_4 VALUES LESS THAN (20)
    ),
    PARTITION P_RANGE4 VALUES LESS THAN (20)
    (
        SUBPARTITION P_RANGE4_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE4_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE4_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE4_4 VALUES LESS THAN (20)
    ),
    PARTITION P_RANGE5 VALUES LESS THAN (25) TABLESPACE hw_subpartition_tablespace_ts3,
    PARTITION P_RANGE6 VALUES LESS THAN (30)
);
SELECT pg_get_tabledef('t_range_range2');
DROP TABLE t_range_range2;

--range-list
CREATE TABLE t_range_list1(c1 int, c2 int, c3 int)
PARTITION BY RANGE (c1) SUBPARTITION BY LIST (c2)
(
    PARTITION P_RANGE1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_RANGE1_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE1_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE1_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_RANGE2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_RANGE2_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE2_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE2_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_RANGE3 VALUES LESS THAN (15)
    (
        SUBPARTITION P_RANGE3_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE3_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE3_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_RANGE4 VALUES LESS THAN (20) TABLESPACE hw_subpartition_tablespace_ts1,
    PARTITION P_RANGE5 VALUES LESS THAN (25)
);
SELECT pg_get_tabledef('t_range_list1');
DROP TABLE t_range_list1;

CREATE TABLE t_range_list2(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY RANGE (c1) SUBPARTITION BY LIST (c2)
(
    PARTITION P_RANGE1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_RANGE1_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE1_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE1_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE1_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_RANGE2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_RANGE2_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE2_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE2_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE2_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_RANGE3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_RANGE3_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE3_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE3_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE3_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_RANGE4 VALUES LESS THAN (20)
    (
        SUBPARTITION P_RANGE4_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE4_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE4_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE4_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_RANGE5 VALUES LESS THAN (25) TABLESPACE hw_subpartition_tablespace_ts3,
    PARTITION P_RANGE6 VALUES LESS THAN (30)
);
SELECT pg_get_tabledef('t_range_list2');
DROP TABLE t_range_list2;

--range-hash
CREATE TABLE t_range_hash1(c1 int, c2 int, c3 int)
PARTITION BY RANGE (c1) SUBPARTITION BY HASH (c2)
(
    PARTITION P_RANGE1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_RANGE1_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE1_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE1_3
    ),
    PARTITION P_RANGE2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_RANGE2_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE2_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE2_3
    ),
    PARTITION P_RANGE3 VALUES LESS THAN (15)
    (
        SUBPARTITION P_RANGE3_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE3_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE3_3
    ),
    PARTITION P_RANGE4 VALUES LESS THAN (20) TABLESPACE hw_subpartition_tablespace_ts1,
    PARTITION P_RANGE5 VALUES LESS THAN (25)
);
SELECT pg_get_tabledef('t_range_hash1');
DROP TABLE t_range_hash1;

CREATE TABLE t_range_hash2(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY RANGE (c1) SUBPARTITION BY HASH (c2)
(
    PARTITION P_RANGE1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_RANGE1_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE1_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE1_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE1_4
    ),
    PARTITION P_RANGE2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_RANGE2_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE2_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE2_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE2_4
    ),
    PARTITION P_RANGE3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_RANGE3_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE3_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE3_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE3_4
    ),
    PARTITION P_RANGE4 VALUES LESS THAN (20)
    (
        SUBPARTITION P_RANGE4_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE4_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE4_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE4_4
    ),
    PARTITION P_RANGE5 VALUES LESS THAN (25) TABLESPACE hw_subpartition_tablespace_ts3,
    PARTITION P_RANGE6 VALUES LESS THAN (30)
);
SELECT pg_get_tabledef('t_range_hash2');
DROP TABLE t_range_hash2;

--list-range
CREATE TABLE t_list_range1(c1 int, c2 int, c3 int)
PARTITION BY LIST (c1) SUBPARTITION BY RANGE (c2)
(
    PARTITION P_LIST1 VALUES (1,2,3,4,5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_LIST1_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST1_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST1_3 VALUES LESS THAN (15)
    ),
    PARTITION P_LIST2 VALUES (6,7,8,9,10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_LIST2_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST2_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST2_3 VALUES LESS THAN (15)
    ),
    PARTITION P_LIST3 VALUES (11,12,13,14,15)
    (
        SUBPARTITION P_LIST3_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST3_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST3_3 VALUES LESS THAN (15)
    ),
    PARTITION P_LIST4 VALUES (16,17,18,19,20) TABLESPACE hw_subpartition_tablespace_ts1,
    PARTITION P_LIST5 VALUES (21,22,23,24,25)
);
SELECT pg_get_tabledef('t_list_range1');
DROP TABLE t_list_range1;

CREATE TABLE t_list_range2(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY LIST (c1) SUBPARTITION BY RANGE (c2)
(
    PARTITION P_LIST1 VALUES (1,2,3,4,5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_LIST1_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST1_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST1_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST1_4 VALUES LESS THAN (20)
    ),
    PARTITION P_LIST2 VALUES (6,7,8,9,10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_LIST2_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST2_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST2_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST2_4 VALUES LESS THAN (20)
    ),
    PARTITION P_LIST3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_LIST3_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST3_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST3_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST3_4 VALUES LESS THAN (20)
    ),
    PARTITION P_LIST4 VALUES (16,17,18,19,20)
    (
        SUBPARTITION P_LIST4_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST4_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST4_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST4_4 VALUES LESS THAN (20)
    ),
    PARTITION P_LIST5 VALUES (21,22,23,24,25) TABLESPACE hw_subpartition_tablespace_ts3,
    PARTITION P_LIST6 VALUES (26,27,28,29,30)
);
SELECT pg_get_tabledef('t_list_range2');
DROP TABLE t_list_range2;

--list-list
CREATE TABLE t_list_list1(c1 int, c2 int, c3 int)
PARTITION BY LIST (c1) SUBPARTITION BY LIST (c2)
(
    PARTITION P_LIST1 VALUES (1,2,3,4,5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_LIST1_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST1_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST1_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_LIST2 VALUES (6,7,8,9,10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_LIST2_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST2_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST2_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_LIST3 VALUES (11,12,13,14,15)
    (
        SUBPARTITION P_LIST3_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST3_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST3_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_LIST4 VALUES (16,17,18,19,20) TABLESPACE hw_subpartition_tablespace_ts1,
    PARTITION P_LIST5 VALUES (21,22,23,24,25)
);
SELECT pg_get_tabledef('t_list_list1');
DROP TABLE t_list_list1;

CREATE TABLE t_list_list2(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY LIST (c1) SUBPARTITION BY LIST (c2)
(
    PARTITION P_LIST1 VALUES (1,2,3,4,5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_LIST1_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST1_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST1_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST1_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_LIST2 VALUES (6,7,8,9,10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_LIST2_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST2_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST2_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST2_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_LIST3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_LIST3_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST3_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST3_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST3_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_LIST4 VALUES (16,17,18,19,20)
    (
        SUBPARTITION P_LIST4_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST4_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST4_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST4_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_LIST5 VALUES (21,22,23,24,25) TABLESPACE hw_subpartition_tablespace_ts3,
    PARTITION P_LIST6 VALUES (26,27,28,29,30)
);
SELECT pg_get_tabledef('t_list_list2');
DROP TABLE t_list_list2;

--list-hash
CREATE TABLE t_list_hash1(c1 int, c2 int, c3 int)
PARTITION BY LIST (c1) SUBPARTITION BY HASH (c2)
(
    PARTITION P_LIST1 VALUES (1,2,3,4,5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_LIST1_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST1_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST1_3
    ),
    PARTITION P_LIST2 VALUES (6,7,8,9,10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_LIST2_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST2_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST2_3
    ),
    PARTITION P_LIST3 VALUES (11,12,13,14,15)
    (
        SUBPARTITION P_LIST3_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST3_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST3_3
    ),
    PARTITION P_LIST4 VALUES (16,17,18,19,20) TABLESPACE hw_subpartition_tablespace_ts1,
    PARTITION P_LIST5 VALUES (21,22,23,24,25)
);
SELECT pg_get_tabledef('t_list_hash1');
DROP TABLE t_list_hash1;

CREATE TABLE t_list_hash2(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY LIST (c1) SUBPARTITION BY HASH (c2)
(
    PARTITION P_LIST1 VALUES (1,2,3,4,5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_LIST1_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST1_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST1_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST1_4
    ),
    PARTITION P_LIST2 VALUES (6,7,8,9,10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_LIST2_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST2_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST2_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST2_4
    ),
    PARTITION P_LIST3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_LIST3_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST3_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST3_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST3_4
    ),
    PARTITION P_LIST4 VALUES (16,17,18,19,20)
    (
        SUBPARTITION P_LIST4_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST4_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST4_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST4_4
    ),
    PARTITION P_LIST5 VALUES (21,22,23,24,25) TABLESPACE hw_subpartition_tablespace_ts3,
    PARTITION P_LIST6 VALUES (26,27,28,29,30)
);
SELECT pg_get_tabledef('t_list_hash2');
DROP TABLE t_list_hash2;

--hash-range
CREATE TABLE t_hash_range1(c1 int, c2 int, c3 int)
PARTITION BY HASH (c1) SUBPARTITION BY RANGE (c2)
(
    PARTITION P_HASH1 TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_HASH1_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH1_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH1_3 VALUES LESS THAN (15)
    ),
    PARTITION P_HASH2 TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_HASH2_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH2_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH2_3 VALUES LESS THAN (15)
    ),
    PARTITION P_HASH3
    (
        SUBPARTITION P_HASH3_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH3_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH3_3 VALUES LESS THAN (15)
    ),
    PARTITION P_HASH4 TABLESPACE hw_subpartition_tablespace_ts1,
    PARTITION P_HASH5
);
SELECT pg_get_tabledef('t_hash_range1');
DROP TABLE t_hash_range1;

CREATE TABLE t_hash_range2(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY HASH (c1) SUBPARTITION BY RANGE (c2)
(
    PARTITION P_HASH1 TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_HASH1_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH1_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH1_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH1_4 VALUES LESS THAN (20)
    ),
    PARTITION P_HASH2 TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_HASH2_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH2_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH2_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH2_4 VALUES LESS THAN (20)
    ),
    PARTITION P_HASH3 TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_HASH3_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH3_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH3_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH3_4 VALUES LESS THAN (20)
    ),
    PARTITION P_HASH4
    (
        SUBPARTITION P_HASH4_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH4_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH4_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH4_4 VALUES LESS THAN (20)
    ),
    PARTITION P_HASH5 TABLESPACE hw_subpartition_tablespace_ts3,
    PARTITION P_HASH6
);
SELECT pg_get_tabledef('t_hash_range2');
DROP TABLE t_hash_range2;

--hash-list
CREATE TABLE t_hash_list1(c1 int, c2 int, c3 int)
PARTITION BY HASH (c1) SUBPARTITION BY LIST (c2)
(
    PARTITION P_HASH1 TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_HASH1_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH1_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH1_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_HASH2 TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_HASH2_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH2_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH2_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_HASH3
    (
        SUBPARTITION P_HASH3_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH3_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH3_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_HASH4 TABLESPACE hw_subpartition_tablespace_ts1,
    PARTITION P_HASH5
);
SELECT pg_get_tabledef('t_hash_list1');
DROP TABLE t_hash_list1;

CREATE TABLE t_hash_list2(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY HASH (c1) SUBPARTITION BY LIST (c2)
(
    PARTITION P_HASH1 TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_HASH1_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH1_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH1_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH1_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_HASH2 TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_HASH2_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH2_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH2_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH2_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_HASH3 TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_HASH3_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH3_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH3_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH3_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_HASH4
    (
        SUBPARTITION P_HASH4_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH4_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH4_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH4_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_HASH5 TABLESPACE hw_subpartition_tablespace_ts3,
    PARTITION P_HASH6
);
SELECT pg_get_tabledef('t_hash_list2');
DROP TABLE t_hash_list2;

--hash-hash
CREATE TABLE t_hash_hash1(c1 int, c2 int, c3 int)
PARTITION BY HASH (c1) SUBPARTITION BY HASH (c2)
(
    PARTITION P_HASH1 TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_HASH1_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH1_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH1_3
    ),
    PARTITION P_HASH2 TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_HASH2_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH2_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH2_3
    ),
    PARTITION P_HASH3
    (
        SUBPARTITION P_HASH3_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH3_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH3_3
    ),
    PARTITION P_HASH4 TABLESPACE hw_subpartition_tablespace_ts1,
    PARTITION P_HASH5
);
SELECT pg_get_tabledef('t_hash_hash1');
DROP TABLE t_hash_hash1;

CREATE TABLE t_hash_hash2(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY HASH (c1) SUBPARTITION BY HASH (c2)
(
    PARTITION P_HASH1 TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_HASH1_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH1_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH1_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH1_4
    ),
    PARTITION P_HASH2 TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_HASH2_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH2_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH2_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH2_4
    ),
    PARTITION P_HASH3 TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_HASH3_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH3_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH3_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH3_4
    ),
    PARTITION P_HASH4
    (
        SUBPARTITION P_HASH4_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH4_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH4_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH4_4
    ),
    PARTITION P_HASH5 TABLESPACE hw_subpartition_tablespace_ts3,
    PARTITION P_HASH6
);
SELECT pg_get_tabledef('t_hash_hash2');
DROP TABLE t_hash_hash2;

--
----test add partition with tablespace----
--
--since the add subpartition define use the same code, we only test different partition type: range/list
--range-list
CREATE TABLE t_range_list3(c1 int, c2 int, c3 int)
PARTITION BY RANGE (c1) SUBPARTITION BY LIST (c2)
(
    PARTITION P_RANGE1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_RANGE1_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE1_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE1_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_RANGE2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_RANGE2_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE2_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE2_3 VALUES (11,12,13,14,15)
    )
);
ALTER TABLE t_range_list3 ADD PARTITION P_RANGE3 VALUES LESS THAN (15)
    (
        SUBPARTITION P_RANGE3_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE3_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE3_3 VALUES (11,12,13,14,15)
    );
ALTER TABLE t_range_list3 ADD PARTITION P_RANGE4 VALUES LESS THAN (20) TABLESPACE hw_subpartition_tablespace_ts1;
ALTER TABLE t_range_list3 ADD PARTITION P_RANGE5 VALUES LESS THAN (25);
SELECT pg_get_tabledef('t_range_list3');
DROP TABLE t_range_list3;


CREATE TABLE t_range_list4(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY RANGE (c1) SUBPARTITION BY LIST (c2)
(
    PARTITION P_RANGE1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_RANGE1_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE1_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE1_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE1_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_RANGE2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_RANGE2_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE2_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE2_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE2_4 VALUES (16,17,18,19,20)
    )
);
ALTER TABLE t_range_list4 ADD PARTITION P_RANGE3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_RANGE3_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE3_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE3_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE3_4 VALUES (16,17,18,19,20)
    );
ALTER TABLE t_range_list4 ADD PARTITION P_RANGE4 VALUES LESS THAN (20)
    (
        SUBPARTITION P_RANGE4_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE4_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE4_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE4_4 VALUES (16,17,18,19,20)
    );
ALTER TABLE t_range_list4 ADD PARTITION P_RANGE5 VALUES LESS THAN (25) TABLESPACE hw_subpartition_tablespace_ts3;
ALTER TABLE t_range_list4 ADD PARTITION P_RANGE6 VALUES LESS THAN (30);
SELECT pg_get_tabledef('t_range_list4');
DROP TABLE t_range_list4;

--list-hash
CREATE TABLE t_list_hash3(c1 int, c2 int, c3 int)
PARTITION BY LIST (c1) SUBPARTITION BY HASH (c2)
(
    PARTITION P_LIST1 VALUES (1,2,3,4,5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_LIST1_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST1_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST1_3
    ),
    PARTITION P_LIST2 VALUES (6,7,8,9,10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_LIST2_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST2_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST2_3
    )
);

ALTER TABLE t_list_hash3 ADD PARTITION P_LIST3 VALUES (11,12,13,14,15)
    (
        SUBPARTITION P_LIST3_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST3_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST3_3
    );
ALTER TABLE t_list_hash3 ADD PARTITION P_LIST4 VALUES (16,17,18,19,20) TABLESPACE hw_subpartition_tablespace_ts1;
ALTER TABLE t_list_hash3 ADD PARTITION P_LIST5 VALUES (21,22,23,24,25);
SELECT pg_get_tabledef('t_list_hash3');
DROP TABLE t_list_hash3;

CREATE TABLE t_list_hash4(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY LIST (c1) SUBPARTITION BY HASH (c2)
(
    PARTITION P_LIST1 VALUES (1,2,3,4,5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_LIST1_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST1_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST1_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST1_4
    ),
    PARTITION P_LIST2 VALUES (6,7,8,9,10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_LIST2_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST2_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST2_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST2_4
    )
);
ALTER TABLE t_list_hash4 ADD PARTITION P_LIST3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_LIST3_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST3_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST3_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST3_4
    );
ALTER TABLE t_list_hash4 ADD PARTITION P_LIST4 VALUES (16,17,18,19,20)
    (
        SUBPARTITION P_LIST4_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST4_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST4_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST4_4
    );
ALTER TABLE t_list_hash4 ADD PARTITION P_LIST5 VALUES (21,22,23,24,25) TABLESPACE hw_subpartition_tablespace_ts3;
ALTER TABLE t_list_hash4 ADD PARTITION P_LIST6 VALUES (26,27,28,29,30);
SELECT pg_get_tabledef('t_list_hash4');
DROP TABLE t_list_hash4;

--
----test add subpartition with tablespace----
--
--list-range
CREATE TABLE t_list_range3(c1 int, c2 int, c3 int)
PARTITION BY LIST (c1) SUBPARTITION BY RANGE (c2)
(
    PARTITION P_LIST1 VALUES (1,2,3,4,5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_LIST1_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST1_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST1_3 VALUES LESS THAN (15)
    ),
    PARTITION P_LIST2 VALUES (6,7,8,9,10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_LIST2_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST2_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST2_3 VALUES LESS THAN (15)
    ),
    PARTITION P_LIST3 VALUES (11,12,13,14,15)
    (
        SUBPARTITION P_LIST3_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST3_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST3_3 VALUES LESS THAN (15)
    ),
    PARTITION P_LIST4 VALUES (16,17,18,19,20) TABLESPACE hw_subpartition_tablespace_ts1,
    PARTITION P_LIST5 VALUES (21,22,23,24,25)
);
ALTER TABLE t_list_range3 MODIFY PARTITION P_LIST1 ADD SUBPARTITION P_LIST1_4 VALUES LESS THAN (20) TABLESPACE hw_subpartition_tablespace_ts3;
ALTER TABLE t_list_range3 MODIFY PARTITION P_LIST2 ADD SUBPARTITION P_LIST2_4 VALUES LESS THAN (20);
ALTER TABLE t_list_range3 MODIFY PARTITION P_LIST3 ADD SUBPARTITION P_LIST3_4 VALUES LESS THAN (20);
SELECT pg_get_tabledef('t_list_range3');
DROP TABLE t_list_range3;

CREATE TABLE t_list_range4(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY LIST (c1) SUBPARTITION BY RANGE (c2)
(
    PARTITION P_LIST1 VALUES (1,2,3,4,5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_LIST1_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST1_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST1_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST1_4 VALUES LESS THAN (20)
    ),
    PARTITION P_LIST2 VALUES (6,7,8,9,10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_LIST2_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST2_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST2_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST2_4 VALUES LESS THAN (20)
    ),
    PARTITION P_LIST3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_LIST3_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST3_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST3_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST3_4 VALUES LESS THAN (20)
    ),
    PARTITION P_LIST4 VALUES (16,17,18,19,20)
    (
        SUBPARTITION P_LIST4_1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_LIST4_2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_LIST4_3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_LIST4_4 VALUES LESS THAN (20)
    ),
    PARTITION P_LIST5 VALUES (21,22,23,24,25) TABLESPACE hw_subpartition_tablespace_ts3,
    PARTITION P_LIST6 VALUES (26,27,28,29,30)
);
ALTER TABLE t_list_range4 MODIFY PARTITION P_LIST1 ADD SUBPARTITION P_LIST1_5 VALUES LESS THAN (25) TABLESPACE hw_subpartition_tablespace_ts3;
ALTER TABLE t_list_range4 MODIFY PARTITION P_LIST2 ADD SUBPARTITION P_LIST2_5 VALUES LESS THAN (25) TABLESPACE hw_subpartition_tablespace_ts2;
ALTER TABLE t_list_range4 MODIFY PARTITION P_LIST3 ADD SUBPARTITION P_LIST3_5 VALUES LESS THAN (25);
ALTER TABLE t_list_range4 MODIFY PARTITION P_LIST4 ADD SUBPARTITION P_LIST4_5 VALUES LESS THAN (25);
SELECT pg_get_tabledef('t_list_range4');
DROP TABLE t_list_range4;

--hash-list
CREATE TABLE t_hash_list3(c1 int, c2 int, c3 int)
PARTITION BY HASH (c1) SUBPARTITION BY LIST (c2)
(
    PARTITION P_HASH1 TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_HASH1_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH1_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH1_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_HASH2 TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_HASH2_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH2_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH2_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_HASH3
    (
        SUBPARTITION P_HASH3_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH3_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH3_3 VALUES (11,12,13,14,15)
    ),
    PARTITION P_HASH4 TABLESPACE hw_subpartition_tablespace_ts1,
    PARTITION P_HASH5
);
ALTER TABLE t_hash_list3 MODIFY PARTITION P_HASH1 ADD SUBPARTITION P_HASH1_4 VALUES (16,17,18,19,20) TABLESPACE hw_subpartition_tablespace_ts3;
ALTER TABLE t_hash_list3 MODIFY PARTITION P_HASH2 ADD SUBPARTITION P_HASH2_4 VALUES (16,17,18,19,20);
ALTER TABLE t_hash_list3 MODIFY PARTITION P_HASH3 ADD SUBPARTITION P_HASH3_4 VALUES (16,17,18,19,20);
SELECT pg_get_tabledef('t_hash_list3');
DROP TABLE t_hash_list3;

CREATE TABLE t_hash_list4(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY HASH (c1) SUBPARTITION BY LIST (c2)
(
    PARTITION P_HASH1 TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_HASH1_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH1_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH1_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH1_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_HASH2 TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_HASH2_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH2_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH2_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH2_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_HASH3 TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_HASH3_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH3_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH3_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH3_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_HASH4
    (
        SUBPARTITION P_HASH4_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_HASH4_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_HASH4_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_HASH4_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_HASH5 TABLESPACE hw_subpartition_tablespace_ts3,
    PARTITION P_HASH6
);
ALTER TABLE t_hash_list4 MODIFY PARTITION P_HASH1 ADD SUBPARTITION P_HASH1_5 VALUES(21,22,23,24,25) TABLESPACE hw_subpartition_tablespace_ts3;
ALTER TABLE t_hash_list4 MODIFY PARTITION P_HASH2 ADD SUBPARTITION P_HASH2_5 VALUES(21,22,23,24,25) TABLESPACE hw_subpartition_tablespace_ts2;
ALTER TABLE t_hash_list4 MODIFY PARTITION P_HASH3 ADD SUBPARTITION P_HASH3_5 VALUES(21,22,23,24,25);
ALTER TABLE t_hash_list4 MODIFY PARTITION P_HASH4 ADD SUBPARTITION P_HASH4_5 VALUES(21,22,23,24,25);
SELECT pg_get_tabledef('t_hash_list4');
DROP TABLE t_hash_list4;

--
----test create index with tablespace----
--
CREATE TABLE t_range_list(c1 int, c2 int, c3 int) TABLESPACE hw_subpartition_tablespace_ts1
PARTITION BY RANGE (c1) SUBPARTITION BY LIST (c2)
(
    PARTITION P_RANGE1 VALUES LESS THAN (5) TABLESPACE hw_subpartition_tablespace_ts1
    (
        SUBPARTITION P_RANGE1_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE1_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE1_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE1_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_RANGE2 VALUES LESS THAN (10) TABLESPACE hw_subpartition_tablespace_ts2
    (
        SUBPARTITION P_RANGE2_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE2_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE2_3 VALUES (DEFAULT)
    ),
    PARTITION P_RANGE3 VALUES LESS THAN (15) TABLESPACE hw_subpartition_tablespace_ts3
    (
        SUBPARTITION P_RANGE3_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE3_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION P_RANGE3_3 VALUES (11,12,13,14,15) TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION P_RANGE3_4 VALUES (16,17,18,19,20)
    ),
    PARTITION P_RANGE4 VALUES LESS THAN (20)
    (
        SUBPARTITION P_RANGE4_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION P_RANGE4_2 VALUES (DEFAULT) TABLESPACE hw_subpartition_tablespace_ts2
    ),
    PARTITION P_RANGE5 VALUES LESS THAN (25) TABLESPACE hw_subpartition_tablespace_ts3,
    PARTITION P_RANGE6 VALUES LESS THAN (30)
);

CREATE INDEX t_range_list_idx ON t_range_list(c1,c2) LOCAL
(
    PARTITION idx_p1(
        SUBPARTITION idx_p1_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION idx_p1_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION idx_p1_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION idx_p1_4
    ),
    PARTITION idx_p2 TABLESPACE hw_subpartition_tablespace_ts2(
        SUBPARTITION idx_p2_1,
        SUBPARTITION idx_p2_2,
        SUBPARTITION idx_p2_3
    ),
    PARTITION idx_p3 TABLESPACE hw_subpartition_tablespace_ts2(
        SUBPARTITION idx_p3_1 TABLESPACE hw_subpartition_tablespace_ts1,
        SUBPARTITION idx_p3_2 TABLESPACE hw_subpartition_tablespace_ts2,
        SUBPARTITION idx_p3_3 TABLESPACE hw_subpartition_tablespace_ts3,
        SUBPARTITION idx_p3_4
    ),
    PARTITION idx_p4(
        SUBPARTITION idx_p4_1,
        SUBPARTITION idx_p4_2 TABLESPACE hw_subpartition_tablespace_ts2
    ),
    PARTITION idx_p5 TABLESPACE hw_subpartition_tablespace_ts3(
        SUBPARTITION idx_p5_1
    ),
    PARTITION idx_p6(
        SUBPARTITION idx_p6_1 TABLESPACE hw_subpartition_tablespace_ts2
    )
) TABLESPACE hw_subpartition_tablespace_ts1;

SELECT p.relname, t.spcname FROM pg_partition p, pg_class c, pg_namespace n, pg_tablespace t
WHERE p.parentid = c.oid
    AND c.relname='t_range_list_idx'
    AND c.relnamespace=n.oid
    AND n.nspname=CURRENT_SCHEMA
    AND p.reltablespace = t.oid
ORDER BY p.relname;

SELECT pg_get_indexdef('hw_subpartition_tablespace.t_range_list_idx'::regclass);

DROP TABLE t_range_list;

--finish
drop tablespace hw_subpartition_tablespace_ts1;
drop tablespace hw_subpartition_tablespace_ts2;
drop tablespace hw_subpartition_tablespace_ts3;
\! rm -fr '@testtablespace@/hw_subpartition_tablespace_ts1'
\! rm -fr '@testtablespace@/hw_subpartition_tablespace_ts2'
\! rm -fr '@testtablespace@/hw_subpartition_tablespace_ts3'

DROP SCHEMA hw_subpartition_tablespace CASCADE;
RESET CURRENT_SCHEMA;

CREATE TABLESPACE sub_partition_tablespace relative location 'sub_partition_tablespace'; 
CREATE DATABASE sub_partition_tablespace tablespace sub_partition_tablespace;
\c sub_partition_tablespace
CREATE TABLE t_range_list(c1 int, c2 int, c3 int) TABLESPACE sub_partition_tablespace
PARTITION BY RANGE (c1) SUBPARTITION BY LIST (c2)
(
    PARTITION P_RANGE1 VALUES LESS THAN (5) TABLESPACE sub_partition_tablespace
    (
        SUBPARTITION P_RANGE1_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE sub_partition_tablespace,
        SUBPARTITION P_RANGE1_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE pg_default,
        SUBPARTITION P_RANGE1_3 VALUES (DEFAULT)
    ),
    PARTITION P_RANGE2 VALUES LESS THAN (10) TABLESPACE pg_default
    (
        SUBPARTITION P_RANGE2_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE sub_partition_tablespace,
        SUBPARTITION P_RANGE2_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE pg_default,
        SUBPARTITION P_RANGE2_3 VALUES (DEFAULT)
    ),
    PARTITION P_RANGE3 VALUES LESS THAN (15)
    (
        SUBPARTITION P_RANGE3_1 VALUES ( 1, 2, 3, 4, 5) TABLESPACE sub_partition_tablespace,
        SUBPARTITION P_RANGE3_2 VALUES ( 6, 7, 8, 9,10) TABLESPACE pg_default,
        SUBPARTITION P_RANGE3_4 VALUES (DEFAULT)
    )
);

select pg_get_tabledef('t_range_list');
\c regression
drop database sub_partition_tablespace;
drop tablespace sub_partition_tablespace;