@@ -3,8 +3,8 @@ CREATE SCHEMA pathman;
33CREATE EXTENSION pg_pathman SCHEMA pathman;
44CREATE SCHEMA test;
55CREATE TABLE test.hash_rel (
6- id SERIAL PRIMARY KEY,
7- value INTEGER);
6+ id SERIAL PRIMARY KEY,
7+ value INTEGER);
88INSERT INTO test.hash_rel VALUES (1, 1);
99INSERT INTO test.hash_rel VALUES (2, 2);
1010INSERT INTO test.hash_rel VALUES (3, 3);
@@ -48,9 +48,9 @@ SELECT COUNT(*) FROM ONLY test.hash_rel;
4848(1 row)
4949
5050CREATE 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);
5454CREATE INDEX ON test.range_rel (dt);
5555INSERT INTO test.range_rel (dt, txt)
5656SELECT 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;
8080(1 row)
8181
8282CREATE TABLE test.num_range_rel (
83- id SERIAL PRIMARY KEY,
84- txt TEXT);
83+ id SERIAL PRIMARY KEY,
84+ txt TEXT);
8585SELECT pathman.create_range_partitions('test.num_range_rel', 'id', 0, 1000, 4);
8686NOTICE: sequence "num_range_rel_seq" does not exist, skipping
8787NOTICE: Copying data to partitions...
@@ -103,7 +103,7 @@ SELECT COUNT(*) FROM ONLY test.num_range_rel;
103103(1 row)
104104
105105INSERT 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;
107107SELECT COUNT(*) FROM test.num_range_rel;
108108 count
109109-------
@@ -648,8 +648,8 @@ DROP TABLE test.range_rel CASCADE;
648648NOTICE: drop cascades to 7 other objects
649649/* Test automatic partition creation */
650650CREATE TABLE test.range_rel (
651- id SERIAL PRIMARY KEY,
652- dt TIMESTAMP NOT NULL);
651+ id SERIAL PRIMARY KEY,
652+ dt TIMESTAMP NOT NULL);
653653SELECT pathman.create_range_partitions('test.range_rel', 'dt', '2015-01-01'::DATE, '10 days'::INTERVAL, 1);
654654NOTICE: Copying data to partitions...
655655 create_range_partitions
@@ -698,8 +698,8 @@ SELECT * FROM pathman.pathman_config;
698698
699699/* Check overlaps */
700700CREATE TABLE test.num_range_rel (
701- id SERIAL PRIMARY KEY,
702- txt TEXT);
701+ id SERIAL PRIMARY KEY,
702+ txt TEXT);
703703SELECT pathman.create_range_partitions('test.num_range_rel', 'id', 1000, 1000, 4);
704704NOTICE: Copying data to partitions...
705705 create_range_partitions
@@ -754,8 +754,8 @@ DROP EXTENSION pg_pathman;
754754CREATE EXTENSION pg_pathman;
755755/* Hash */
756756CREATE TABLE hash_rel (
757- id SERIAL PRIMARY KEY,
758- value INTEGER NOT NULL);
757+ id SERIAL PRIMARY KEY,
758+ value INTEGER NOT NULL);
759759INSERT INTO hash_rel (value) SELECT g FROM generate_series(1, 10000) as g;
760760SELECT create_hash_partitions('hash_rel', 'value', 3);
761761NOTICE: function hash_rel_hash_insert_trigger_func() does not exist, skipping
@@ -780,9 +780,10 @@ EXPLAIN (COSTS OFF) SELECT * FROM hash_rel WHERE id = 1234;
780780
781781/* Range */
782782CREATE TABLE range_rel (
783- id SERIAL PRIMARY KEY,
784- dt TIMESTAMP NOT NULL);
785- INSERT INTO range_rel (dt) SELECT g FROM generate_series('2010-01-01'::date, '2010-12-31'::date, '1 day') as g;
783+ idSERIAL PRIMARY KEY,
784+ dtTIMESTAMP NOT NULL,
785+ valueINTEGER);
786+ 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;
786787SELECT create_range_partitions('range_rel', 'dt', '2010-01-01'::date, '1 month'::interval, 12);
787788NOTICE: sequence "range_rel_seq" does not exist, skipping
788789NOTICE: Copying data to partitions...
@@ -845,6 +846,65 @@ EXPLAIN (COSTS OFF) SELECT * FROM range_rel WHERE dt > '2010-12-15';
845846 -> Seq Scan on range_rel_14
846847(4 rows)
847848
849+ /* Temporary table for JOINs */
850+ CREATE TABLE tmp (id INTEGER NOT NULL, value INTEGER NOT NULL);
851+ INSERT INTO tmp VALUES (1, 1), (2, 2);
852+ /* Test UPDATE and DELETE */
853+ EXPLAIN (COSTS OFF) UPDATE range_rel SET value = 111 WHERE dt = '2010-06-15';
854+ QUERY PLAN
855+ --------------------------------------------------------------------------------
856+ Update on range_rel_6
857+ -> Seq Scan on range_rel_6
858+ Filter: (dt = 'Tue Jun 15 00:00:00 2010'::timestamp without time zone)
859+ (3 rows)
860+
861+ UPDATE range_rel SET value = 111 WHERE dt = '2010-06-15';
862+ SELECT * FROM range_rel WHERE dt = '2010-06-15';
863+ id | dt | value
864+ -----+--------------------------+-------
865+ 166 | Tue Jun 15 00:00:00 2010 | 111
866+ (1 row)
867+
868+ EXPLAIN (COSTS OFF) DELETE FROM range_rel WHERE dt = '2010-06-15';
869+ QUERY PLAN
870+ --------------------------------------------------------------------------------
871+ Delete on range_rel_6
872+ -> Seq Scan on range_rel_6
873+ Filter: (dt = 'Tue Jun 15 00:00:00 2010'::timestamp without time zone)
874+ (3 rows)
875+
876+ DELETE FROM range_rel WHERE dt = '2010-06-15';
877+ SELECT * FROM range_rel WHERE dt = '2010-06-15';
878+ id | dt | value
879+ ----+----+-------
880+ (0 rows)
881+
882+ 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;
883+ QUERY PLAN
884+ --------------------------------------------------------------------------------------------
885+ Update on range_rel_1 r
886+ -> Hash Join
887+ Hash Cond: (t.id = r.id)
888+ -> Seq Scan on tmp t
889+ -> Hash
890+ -> Index Scan using range_rel_1_pkey on range_rel_1 r
891+ Filter: (dt = 'Fri Jan 01 00:00:00 2010'::timestamp without time zone)
892+ (7 rows)
893+
894+ UPDATE range_rel r SET value = t.value FROM tmp t WHERE r.dt = '2010-01-01' AND r.id = t.id;
895+ EXPLAIN (COSTS OFF) DELETE FROM range_rel r USING tmp t WHERE r.dt = '2010-01-02' AND r.id = t.id;
896+ QUERY PLAN
897+ --------------------------------------------------------------------------------------------
898+ Delete on range_rel_1 r
899+ -> Hash Join
900+ Hash Cond: (t.id = r.id)
901+ -> Seq Scan on tmp t
902+ -> Hash
903+ -> Index Scan using range_rel_1_pkey on range_rel_1 r
904+ Filter: (dt = 'Sat Jan 02 00:00:00 2010'::timestamp without time zone)
905+ (7 rows)
906+
907+ DELETE FROM range_rel r USING tmp t WHERE r.dt = '2010-01-02' AND r.id = t.id;
848908/* Create range partitions from whole range */
849909SELECT drop_range_partitions('range_rel');
850910NOTICE: 0 rows copied from range_rel_15
@@ -856,11 +916,11 @@ NOTICE: 31 rows copied from range_rel_10
856916NOTICE: 30 rows copied from range_rel_9
857917NOTICE: 31 rows copied from range_rel_8
858918NOTICE: 31 rows copied from range_rel_7
859- NOTICE:30 rows copied from range_rel_6
919+ NOTICE:29 rows copied from range_rel_6
860920NOTICE: 31 rows copied from range_rel_5
861921NOTICE: 30 rows copied from range_rel_4
862922NOTICE: 31 rows copied from range_rel_3
863- NOTICE:45 rows copied from range_rel_1
923+ NOTICE:44 rows copied from range_rel_1
864924 drop_range_partitions
865925-----------------------
866926 14