@@ -3,8 +3,8 @@ CREATE SCHEMA pathman;
3
3
CREATE EXTENSION pg_pathman SCHEMA pathman;
4
4
CREATE SCHEMA test;
5
5
CREATE TABLE test.hash_rel (
6
- id SERIAL PRIMARY KEY,
7
- value INTEGER);
6
+ id SERIAL PRIMARY KEY,
7
+ value INTEGER);
8
8
INSERT INTO test.hash_rel VALUES (1, 1);
9
9
INSERT INTO test.hash_rel VALUES (2, 2);
10
10
INSERT INTO test.hash_rel VALUES (3, 3);
@@ -48,9 +48,9 @@ SELECT COUNT(*) FROM ONLY test.hash_rel;
48
48
(1 row)
49
49
50
50
CREATE TABLE test.range_rel (
51
- id SERIAL PRIMARY KEY,
52
- dt TIMESTAMP,
53
- txt TEXT);
51
+ id SERIAL PRIMARY KEY,
52
+ dt TIMESTAMP,
53
+ txt TEXT);
54
54
CREATE INDEX ON test.range_rel (dt);
55
55
INSERT INTO test.range_rel (dt, txt)
56
56
SELECT g, md5(g::TEXT) FROM generate_series('2015-01-01', '2015-04-30', '1 day'::interval) as g;
@@ -80,8 +80,8 @@ SELECT COUNT(*) FROM ONLY test.range_rel;
80
80
(1 row)
81
81
82
82
CREATE TABLE test.num_range_rel (
83
- id SERIAL PRIMARY KEY,
84
- txt TEXT);
83
+ id SERIAL PRIMARY KEY,
84
+ txt TEXT);
85
85
SELECT pathman.create_range_partitions('test.num_range_rel', 'id', 0, 1000, 4);
86
86
NOTICE: sequence "num_range_rel_seq" does not exist, skipping
87
87
NOTICE: Copying data to partitions...
@@ -103,7 +103,7 @@ SELECT COUNT(*) FROM ONLY test.num_range_rel;
103
103
(1 row)
104
104
105
105
INSERT INTO test.num_range_rel
106
- SELECT g, md5(g::TEXT) FROM generate_series(1, 3000) as g;
106
+ SELECT g, md5(g::TEXT) FROM generate_series(1, 3000) as g;
107
107
SELECT COUNT(*) FROM test.num_range_rel;
108
108
count
109
109
-------
@@ -380,6 +380,34 @@ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel WHERE (dt >= '2015-01-15' AND d
380
380
-> Seq Scan on range_rel_4
381
381
(8 rows)
382
382
383
+ /*
384
+ * Test CTE query
385
+ */
386
+ EXPLAIN (COSTS OFF)
387
+ WITH ttt AS (SELECT * FROM test.range_rel WHERE dt >= '2015-02-01' AND dt < '2015-03-15')
388
+ SELECT * FROM ttt;
389
+ QUERY PLAN
390
+ --------------------------------------------------------------------------------------------
391
+ CTE Scan on ttt
392
+ CTE ttt
393
+ -> Append
394
+ -> Seq Scan on range_rel_2
395
+ -> Index Scan using range_rel_3_dt_idx on range_rel_3
396
+ Index Cond: (dt < 'Sun Mar 15 00:00:00 2015'::timestamp without time zone)
397
+ (6 rows)
398
+
399
+ EXPLAIN (COSTS OFF)
400
+ WITH ttt AS (SELECT * FROM test.hash_rel WHERE value = 2)
401
+ SELECT * FROM ttt;
402
+ QUERY PLAN
403
+ --------------------------------------
404
+ CTE Scan on ttt
405
+ CTE ttt
406
+ -> Append
407
+ -> Seq Scan on hash_rel_2
408
+ Filter: (value = 2)
409
+ (5 rows)
410
+
383
411
/*
384
412
* Test split and merge
385
413
*/
@@ -560,6 +588,18 @@ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel WHERE dt BETWEEN '2014-11-15' A
560
588
Index Cond: (dt <= 'Thu Jan 15 00:00:00 2015'::timestamp without time zone)
561
589
(4 rows)
562
590
591
+ CREATE TABLE test.range_rel_test1 (
592
+ id SERIAL PRIMARY KEY,
593
+ dt TIMESTAMP,
594
+ txt TEXT,
595
+ abc INTEGER);
596
+ SELECT pathman.attach_range_partition('test.range_rel', 'test.range_rel_test1', '2013-01-01'::DATE, '2014-01-01'::DATE);
597
+ ERROR: Partition must have the exact same structure as parent P0001
598
+ CREATE TABLE test.range_rel_test2 (
599
+ id SERIAL PRIMARY KEY,
600
+ dt TIMESTAMP);
601
+ SELECT pathman.attach_range_partition('test.range_rel', 'test.range_rel_test2', '2013-01-01'::DATE, '2014-01-01'::DATE);
602
+ ERROR: Partition must have the exact same structure as parent P0001
563
603
/*
564
604
* Clean up
565
605
*/
@@ -620,8 +660,8 @@ DROP TABLE test.range_rel CASCADE;
620
660
NOTICE: drop cascades to 7 other objects
621
661
/* Test automatic partition creation */
622
662
CREATE TABLE test.range_rel (
623
- id SERIAL PRIMARY KEY,
624
- dt TIMESTAMP NOT NULL);
663
+ id SERIAL PRIMARY KEY,
664
+ dt TIMESTAMP NOT NULL);
625
665
SELECT pathman.create_range_partitions('test.range_rel', 'dt', '2015-01-01'::DATE, '10 days'::INTERVAL, 1);
626
666
NOTICE: Copying data to partitions...
627
667
create_range_partitions
@@ -670,8 +710,8 @@ SELECT * FROM pathman.pathman_config;
670
710
671
711
/* Check overlaps */
672
712
CREATE TABLE test.num_range_rel (
673
- id SERIAL PRIMARY KEY,
674
- txt TEXT);
713
+ id SERIAL PRIMARY KEY,
714
+ txt TEXT);
675
715
SELECT pathman.create_range_partitions('test.num_range_rel', 'id', 1000, 1000, 4);
676
716
NOTICE: Copying data to partitions...
677
717
create_range_partitions
@@ -726,8 +766,8 @@ DROP EXTENSION pg_pathman;
726
766
CREATE EXTENSION pg_pathman;
727
767
/* Hash */
728
768
CREATE TABLE hash_rel (
729
- id SERIAL PRIMARY KEY,
730
- value INTEGER NOT NULL);
769
+ id SERIAL PRIMARY KEY,
770
+ value INTEGER NOT NULL);
731
771
INSERT INTO hash_rel (value) SELECT g FROM generate_series(1, 10000) as g;
732
772
SELECT create_hash_partitions('hash_rel', 'value', 3);
733
773
NOTICE: function hash_rel_hash_insert_trigger_func() does not exist, skipping
@@ -752,9 +792,10 @@ EXPLAIN (COSTS OFF) SELECT * FROM hash_rel WHERE id = 1234;
752
792
753
793
/* Range */
754
794
CREATE TABLE range_rel (
755
- id SERIAL PRIMARY KEY,
756
- dt TIMESTAMP NOT NULL);
757
- INSERT INTO range_rel (dt) SELECT g FROM generate_series('2010-01-01'::date, '2010-12-31'::date, '1 day') as g;
795
+ id SERIAL PRIMARY KEY,
796
+ dt TIMESTAMP NOT NULL,
797
+ value INTEGER);
798
+ INSERT INTO range_rel (dt, value) SELECT g, extract(day from g) FROM generate_series('2010-01-01'::date, '2010-12-31'::date, '1 day') as g;
758
799
SELECT create_range_partitions('range_rel', 'dt', '2010-01-01'::date, '1 month'::interval, 12);
759
800
NOTICE: sequence "range_rel_seq" does not exist, skipping
760
801
NOTICE: Copying data to partitions...
@@ -817,6 +858,65 @@ EXPLAIN (COSTS OFF) SELECT * FROM range_rel WHERE dt > '2010-12-15';
817
858
-> Seq Scan on range_rel_14
818
859
(4 rows)
819
860
861
+ /* Temporary table for JOINs */
862
+ CREATE TABLE tmp (id INTEGER NOT NULL, value INTEGER NOT NULL);
863
+ INSERT INTO tmp VALUES (1, 1), (2, 2);
864
+ /* Test UPDATE and DELETE */
865
+ EXPLAIN (COSTS OFF) UPDATE range_rel SET value = 111 WHERE dt = '2010-06-15';
866
+ QUERY PLAN
867
+ --------------------------------------------------------------------------------
868
+ Update on range_rel_6
869
+ -> Seq Scan on range_rel_6
870
+ Filter: (dt = 'Tue Jun 15 00:00:00 2010'::timestamp without time zone)
871
+ (3 rows)
872
+
873
+ UPDATE range_rel SET value = 111 WHERE dt = '2010-06-15';
874
+ SELECT * FROM range_rel WHERE dt = '2010-06-15';
875
+ id | dt | value
876
+ -----+--------------------------+-------
877
+ 166 | Tue Jun 15 00:00:00 2010 | 111
878
+ (1 row)
879
+
880
+ EXPLAIN (COSTS OFF) DELETE FROM range_rel WHERE dt = '2010-06-15';
881
+ QUERY PLAN
882
+ --------------------------------------------------------------------------------
883
+ Delete on range_rel_6
884
+ -> Seq Scan on range_rel_6
885
+ Filter: (dt = 'Tue Jun 15 00:00:00 2010'::timestamp without time zone)
886
+ (3 rows)
887
+
888
+ DELETE FROM range_rel WHERE dt = '2010-06-15';
889
+ SELECT * FROM range_rel WHERE dt = '2010-06-15';
890
+ id | dt | value
891
+ ----+----+-------
892
+ (0 rows)
893
+
894
+ EXPLAIN (COSTS OFF) UPDATE range_rel r SET value = t.value FROM tmp t WHERE r.dt = '2010-01-01' AND r.id = t.id;
895
+ QUERY PLAN
896
+ --------------------------------------------------------------------------------------------
897
+ Update on range_rel_1 r
898
+ -> Hash Join
899
+ Hash Cond: (t.id = r.id)
900
+ -> Seq Scan on tmp t
901
+ -> Hash
902
+ -> Index Scan using range_rel_1_pkey on range_rel_1 r
903
+ Filter: (dt = 'Fri Jan 01 00:00:00 2010'::timestamp without time zone)
904
+ (7 rows)
905
+
906
+ UPDATE range_rel r SET value = t.value FROM tmp t WHERE r.dt = '2010-01-01' AND r.id = t.id;
907
+ EXPLAIN (COSTS OFF) DELETE FROM range_rel r USING tmp t WHERE r.dt = '2010-01-02' AND r.id = t.id;
908
+ QUERY PLAN
909
+ --------------------------------------------------------------------------------------------
910
+ Delete on range_rel_1 r
911
+ -> Hash Join
912
+ Hash Cond: (t.id = r.id)
913
+ -> Seq Scan on tmp t
914
+ -> Hash
915
+ -> Index Scan using range_rel_1_pkey on range_rel_1 r
916
+ Filter: (dt = 'Sat Jan 02 00:00:00 2010'::timestamp without time zone)
917
+ (7 rows)
918
+
919
+ DELETE FROM range_rel r USING tmp t WHERE r.dt = '2010-01-02' AND r.id = t.id;
820
920
/* Create range partitions from whole range */
821
921
SELECT drop_range_partitions('range_rel');
822
922
NOTICE: 0 rows copied from range_rel_15
@@ -828,11 +928,11 @@ NOTICE: 31 rows copied from range_rel_10
828
928
NOTICE: 30 rows copied from range_rel_9
829
929
NOTICE: 31 rows copied from range_rel_8
830
930
NOTICE: 31 rows copied from range_rel_7
831
- NOTICE: 30 rows copied from range_rel_6
931
+ NOTICE: 29 rows copied from range_rel_6
832
932
NOTICE: 31 rows copied from range_rel_5
833
933
NOTICE: 30 rows copied from range_rel_4
834
934
NOTICE: 31 rows copied from range_rel_3
835
- NOTICE: 45 rows copied from range_rel_1
935
+ NOTICE: 44 rows copied from range_rel_1
836
936
drop_range_partitions
837
937
-----------------------
838
938
14
0 commit comments