1
1
/*
2
2
* Creates RANGE partitions for specified relation
3
3
*/
4
- CREATE OR REPLACE FUNCTION create_range_partitions_time (
4
+ CREATE OR REPLACE FUNCTION create_range_partitions (
5
5
v_relationTEXT
6
6
, v_attributeTEXT
7
7
, v_start_timestampTIMESTAMPTZ
@@ -19,10 +19,15 @@ BEGIN
19
19
RAISE EXCEPTION' Reltion "%s" has already been partitioned' , v_relation;
20
20
END IF;
21
21
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);
26
31
27
32
INSERT INTO pg_pathman_rels (
28
33
relname
@@ -44,60 +49,74 @@ $$ LANGUAGE plpgsql;
44
49
/*
45
50
* Create additional partitions for existing RANGE partitioning
46
51
*/
47
- CREATE OR REPLACE FUNCTION append_range_partitions_time (
52
+ CREATE OR REPLACE FUNCTION append_range_partitions (
48
53
v_relationTEXT
49
- , v_start_timestampTIMESTAMPTZ
50
54
, v_interval INTERVAL
51
55
, v_premakeINTEGER )
52
56
RETURNS VOIDAS
53
57
$$
54
58
DECLARE
55
59
v_part_timestampTIMESTAMPTZ ;
56
- v_part_relnameTEXT ;
57
60
v_partnumINTEGER ;
58
61
v_relidINTEGER ;
59
62
BEGIN
60
63
SELECT relfilenode INTO v_relid
61
64
FROM pg_classWHERE relname= v_relation;
62
65
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;
68
67
69
68
/* Create partitions and update pg_pathman configuration*/
70
69
FOR v_partnumIN 0 ..v_premake- 1
71
70
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 );
75
74
v_part_timestamp := v_part_timestamp+ v_interval;
75
+ END LOOP;
76
76
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;
81
80
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;
85
102
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 );
89
106
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);
96
110
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);
98
116
END
99
117
$$ LANGUAGE plpgsql;
100
118
119
+
101
120
/*
102
121
* Creates range partitioning insert trigger
103
122
*/
@@ -152,15 +171,14 @@ BEGIN
152
171
153
172
EXECUTE v_func;
154
173
EXECUTE v_trigger;
155
- -- RETURN v_func;
156
174
RETURN;
157
175
END
158
176
$$ LANGUAGE plpgsql;
159
177
160
178
/*
161
179
* Drop partitions
162
180
*/
163
- CREATE OR REPLACE FUNCTION public . drop_range_partitions(IN relationTEXT )
181
+ CREATE OR REPLACE FUNCTION drop_range_partitions (IN relationTEXT )
164
182
RETURNS VOIDAS
165
183
$$
166
184
DECLARE
@@ -178,7 +196,7 @@ BEGIN
178
196
END LOOP;
179
197
180
198
DELETE 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;
182
200
183
201
/* Notify backend about changes*/
184
202
PERFORM pg_pathman_on_remove_partitions(v_relid);
@@ -188,10 +206,10 @@ $$ LANGUAGE plpgsql;
188
206
/*
189
207
* Drop trigger
190
208
*/
191
- CREATE OR REPLACE FUNCTION public . drop_range_triggers(IN relationTEXT )
209
+ CREATE OR REPLACE FUNCTION drop_range_triggers (IN relationTEXT )
192
210
RETURNS VOIDAS
193
211
$$
194
212
BEGIN
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);
196
214
END
197
215
$$ LANGUAGE plpgsql;