11/*
22 * Creates RANGE partitions for specified relation
33*/
4- CREATE OR REPLACE FUNCTION create_range_partitions_time (
4+ CREATE OR REPLACE FUNCTION create_range_partitions (
55 v_relationTEXT
66 , v_attributeTEXT
77 , v_start_timestampTIMESTAMPTZ
@@ -19,10 +19,15 @@ BEGIN
1919 RAISE EXCEPTION' Reltion "%s" has already been partitioned' , v_relation;
2020 END IF;
2121
22- PERFORM append_range_partitions_time(v_relation
23- , v_start_timestamp
24- , v_interval
25- , v_premake);
22+ IF v_start_timestamp!= NULL THEN
23+ v_start_timestamp := v_start_timestamp;
24+ ELSE
25+ SELECT current_date INTO v_start_timestamp;
26+ END IF;
27+
28+ PERFORM create_single_range_partition(v_relation
29+ , v_start_timestamp
30+ , v_interval);
2631
2732INSERT INTO pg_pathman_rels (
2833 relname
@@ -44,60 +49,74 @@ $$ LANGUAGE plpgsql;
4449/*
4550 * Create additional partitions for existing RANGE partitioning
4651*/
47- CREATE OR REPLACE FUNCTION append_range_partitions_time (
52+ CREATE OR REPLACE FUNCTION append_range_partitions (
4853 v_relationTEXT
49- , v_start_timestampTIMESTAMPTZ
5054 , v_interval INTERVAL
5155 , v_premakeINTEGER )
5256RETURNS VOIDAS
5357$$
5458DECLARE
5559 v_part_timestampTIMESTAMPTZ ;
56- v_part_relnameTEXT ;
5760 v_partnumINTEGER ;
5861 v_relidINTEGER ;
5962BEGIN
6063SELECT relfilenode INTO v_relid
6164FROM pg_classWHERE relname= v_relation;
6265
63- IF v_start_timestamp!= NULL THEN
64- v_part_timestamp := v_start_timestamp;
65- ELSE
66- SELECT current_date INTO v_part_timestamp;
67- END IF;
66+ SELECT max (' max_dt' ) INTO v_part_timestampFROM pg_pathman_range_rels;
6867
6968/* Create partitions and update pg_pathman configuration*/
7069 FOR v_partnumIN 0 ..v_premake- 1
7170 LOOP
72- v_part_relname : = format( ' %s_%s '
73- , v_relation
74- , to_char(v_part_timestamp, ' YYYY_MM_DD ' ) );
71+ PERFORM create_single_range_partition(v_relation
72+ , v_part_timestamp
73+ , v_interval );
7574 v_part_timestamp := v_part_timestamp+ v_interval;
75+ END LOOP;
7676
77- /* Skip existing partitions*/
78- IF EXISTS (SELECT * FROM pg_tablesWHERE tablename= v_part_relname) THEN
79- CONTINUE;
80- END IF;
77+ PERFORM pg_pathman_on_update_partitions(v_relid);
78+ END
79+ $$ LANGUAGE plpgsql;
8180
82- EXECUTE format(' CREATE TABLE %s (LIKE %s INCLUDING ALL)'
83- , v_part_relname
84- , v_relation);
81+ /*
82+ *
83+ */
84+ CREATE OR REPLACE FUNCTION create_single_range_partition (
85+ v_parent_relnameTEXT
86+ , v_start_timestampTIMESTAMPTZ
87+ , v_interval INTERVAL)
88+ RETURNS VOIDAS
89+ $$
90+ DECLARE
91+ v_child_relnameTEXT ;
92+ BEGIN
93+ v_child_relname := format(' %s_%s'
94+ , v_parent_relname
95+ , to_char(v_start_timestamp,' YYYY_MM_DD' ));
96+
97+ /* Skip existing partitions*/
98+ IF EXISTS (SELECT * FROM pg_tablesWHERE tablename= v_child_relname) THEN
99+ RAISE WARNING' Relation % already exists, skipping...' , v_child_relname;
100+ RETURN;
101+ END IF;
85102
86- EXECUTE format(' ALTER TABLE %sINHERIT %s'
87- , v_part_relname
88- , v_relation );
103+ EXECUTE format(' CREATE TABLE %s(LIKE %s INCLUDING ALL) '
104+ , v_child_relname
105+ , v_parent_relname );
89106
90- INSERT INTO pg_pathman_range_rels (parent, min_dt, max_dt, child)
91- VALUES (v_relation
92- , v_part_timestamp
93- , v_part_timestamp+ v_interval
94- , v_part_relname);
95- END LOOP;
107+ EXECUTE format(' ALTER TABLE %s INHERIT %s'
108+ , v_child_relname
109+ , v_parent_relname);
96110
97- PERFORM pg_pathman_on_update_partitions(v_relid);
111+ INSERT INTO pg_pathman_range_rels (parent, min_dt, max_dt, child)
112+ VALUES (v_parent_relname
113+ , v_start_timestamp
114+ , v_start_timestamp+ v_interval
115+ , v_child_relname);
98116END
99117$$ LANGUAGE plpgsql;
100118
119+
101120/*
102121 * Creates range partitioning insert trigger
103122*/
@@ -152,15 +171,14 @@ BEGIN
152171
153172 EXECUTE v_func;
154173 EXECUTE v_trigger;
155- -- RETURN v_func;
156174 RETURN;
157175END
158176$$ LANGUAGE plpgsql;
159177
160178/*
161179 * Drop partitions
162180*/
163- CREATE OR REPLACE FUNCTION public . drop_range_partitions(IN relationTEXT )
181+ CREATE OR REPLACE FUNCTION drop_range_partitions (IN relationTEXT )
164182RETURNS VOIDAS
165183$$
166184DECLARE
@@ -178,7 +196,7 @@ BEGIN
178196 END LOOP;
179197
180198DELETE FROM pg_pathman_relsWHERE relname= relation;
181- DELETE FROM pg_pathman_hash_rels WHERE parent= relation;
199+ DELETE FROM pg_pathman_range_rels WHERE parent= relation;
182200
183201/* Notify backend about changes*/
184202 PERFORM pg_pathman_on_remove_partitions(v_relid);
@@ -188,10 +206,10 @@ $$ LANGUAGE plpgsql;
188206/*
189207 * Drop trigger
190208*/
191- CREATE OR REPLACE FUNCTION public . drop_range_triggers(IN relationTEXT )
209+ CREATE OR REPLACE FUNCTION drop_range_triggers (IN relationTEXT )
192210RETURNS VOIDAS
193211$$
194212BEGIN
195- EXECUTE format(' DROP TRIGGER IF EXISTS %s_range_insert_trigger_func ON %1$s CASCADE' , relation);
213+ EXECUTE format(' DROP TRIGGER IF EXISTS %s_insert_trigger ON %1$s CASCADE' , relation);
196214END
197215$$ LANGUAGE plpgsql;