@@ -17,9 +17,9 @@ DECLARE
17
17
BEGIN
18
18
p_relation := @extschema@.validate_relname(p_relation);
19
19
20
- IF p_count <= 0 THEN
21
- RAISE EXCEPTION ' Partitions count must be greater than zero' ;
22
- END IF;
20
+ -- IF p_count <= 0 THEN
21
+ -- RAISE EXCEPTION 'Partitions count must be greater than zero';
22
+ -- END IF;
23
23
24
24
IF EXISTS (SELECT * FROM @extschema@.pathman_config WHERE relname = p_relation) THEN
25
25
RAISE EXCEPTION ' Relation "%" has already been partitioned' , p_relation;
@@ -47,20 +47,32 @@ BEGIN
47
47
END LOOP;
48
48
END IF;
49
49
50
- /* check boundaries */
50
+ /* TODO: think about reusing code */
51
+ -- EXECUTE format('SELECT @extschema@.create_partitions_from_range(''%s'', ''%s'', ''%s'', ''%s''::%s, ''%s''::interval)'
52
+ -- , p_relation
53
+ -- , p_attribute
54
+ -- , p_start_value
55
+ -- , p_start_value + p_interval*p_count
56
+ -- , pg_typeof(p_start_value)
57
+ -- , p_interval);
58
+
59
+ -- RETURN p_count;
60
+
61
+ /* Check boundaries */
51
62
EXECUTE format(' SELECT @extschema@.check_boundaries(' ' %s' ' , ' ' %s' ' , ' ' %s' ' , ' ' %s' ' ::%s)'
52
63
, p_relation
53
64
, p_attribute
54
65
, p_start_value
55
66
, p_start_value + p_interval* p_count
56
67
, pg_typeof(p_start_value));
57
68
58
-
69
+ /* Create sequence for child partitions names */
59
70
EXECUTE format(' DROP SEQUENCE IF EXISTS %s_seq' , p_relation);
60
71
EXECUTE format(' CREATE SEQUENCE %s_seq START 1' , p_relation);
61
72
62
- INSERT INTO @extschema@.pathman_config (relname, attname, parttype)
63
- VALUES (p_relation, p_attribute, 2 );
73
+ /* Insert new entry to pathman config */
74
+ INSERT INTO @extschema@.pathman_config (relname, attname, parttype, range_interval)
75
+ VALUES (p_relation, p_attribute, 2 , p_interval::text );
64
76
65
77
/* create first partition */
66
78
FOR i IN 1 ..p_count
@@ -146,8 +158,9 @@ BEGIN
146
158
EXECUTE format(' DROP SEQUENCE IF EXISTS %s_seq' , p_relation);
147
159
EXECUTE format(' CREATE SEQUENCE %s_seq START 1' , p_relation);
148
160
149
- INSERT INTO @extschema@.pathman_config (relname, attname, parttype)
150
- VALUES (p_relation, p_attribute, 2 );
161
+ /* Insert new entry to pathman config */
162
+ INSERT INTO @extschema@.pathman_config (relname, attname, parttype, range_interval)
163
+ VALUES (p_relation, p_attribute, 2 , p_interval::text );
151
164
152
165
/* create first partition */
153
166
FOR i IN 1 ..p_count
@@ -190,7 +203,6 @@ DECLARE
190
203
v_interval DOUBLE PRECISION ;
191
204
v_dt_interval INTERVAL;
192
205
v_type REGTYPE;
193
- v_is_date BOOL;
194
206
i INTEGER := 0 ;
195
207
BEGIN
196
208
p_relation := @extschema@.validate_relname(p_relation);
@@ -212,8 +224,9 @@ BEGIN
212
224
, p_start_value
213
225
, p_end_value);
214
226
215
- INSERT INTO @extschema@.pathman_config (relname, attname, parttype)
216
- VALUES (p_relation, p_attribute, 2 );
227
+ /* Insert new entry to pathman config */
228
+ INSERT INTO @extschema@.pathman_config (relname, attname, parttype, range_interval)
229
+ VALUES (p_relation, p_attribute, 2 , p_interval::text );
217
230
218
231
WHILE p_start_value <= p_end_value
219
232
LOOP
@@ -256,7 +269,6 @@ DECLARE
256
269
v_interval DOUBLE PRECISION ;
257
270
v_dt_interval INTERVAL;
258
271
v_type REGTYPE;
259
- v_is_date BOOL;
260
272
i INTEGER := 0 ;
261
273
BEGIN
262
274
p_relation := @extschema@.validate_relname(p_relation);
@@ -274,8 +286,9 @@ BEGIN
274
286
, p_start_value
275
287
, p_end_value);
276
288
277
- INSERT INTO @extschema@.pathman_config (relname, attname, parttype)
278
- VALUES (p_relation, p_attribute, 2 );
289
+ /* Insert new entry to pathman config */
290
+ INSERT INTO @extschema@.pathman_config (relname, attname, parttype, range_interval)
291
+ VALUES (p_relation, p_attribute, 2 , p_interval::text );
279
292
280
293
WHILE p_start_value <= p_end_value
281
294
LOOP
@@ -642,15 +655,18 @@ DECLARE
642
655
v_attname TEXT ;
643
656
v_atttype TEXT ;
644
657
v_part_name TEXT ;
658
+ v_interval TEXT ;
645
659
BEGIN
646
660
p_relation := @extschema@.validate_relname(p_relation);
661
+
662
+ SELECT attname, range_interval INTO v_attname, v_interval
663
+ FROM @extschema@.pathman_config WHERE relname = p_relation;
647
664
648
- v_attname := attname FROM @extschema@.pathman_config WHERE relname = p_relation;
649
665
v_atttype := @extschema@.get_attribute_type_name(p_relation, v_attname);
650
- EXECUTE format( ' SELECT @extschema@.append_partition_internal($1, ARRAY[]::%s[]) '
651
- , v_atttype)
666
+
667
+ EXECUTE format( ' SELECT @extschema@.append_partition_internal($1, $2, $3, ARRAY[]::%s[]) ' , v_atttype)
652
668
INTO v_part_name
653
- USING p_relation;
669
+ USING p_relation, v_atttype, v_interval ;
654
670
655
671
RETURN v_part_name;
656
672
END
@@ -660,6 +676,8 @@ LANGUAGE plpgsql;
660
676
661
677
CREATE OR REPLACE FUNCTION @extschema@.append_partition_internal(
662
678
p_relation TEXT
679
+ , p_atttype TEXT
680
+ , p_interval TEXT
663
681
, p_range ANYARRAY DEFAULT NULL )
664
682
RETURNS TEXT AS
665
683
$$
@@ -668,9 +686,15 @@ DECLARE
668
686
BEGIN
669
687
p_range := @extschema@.get_range_by_idx(p_relation::regclass::oid , - 1 , 0 );
670
688
RAISE NOTICE ' Appending new partition...' ;
671
- v_part_name := @extschema@.create_single_range_partition(p_relation
672
- , p_range[2 ]
673
- , p_range[2 ] + (p_range[2 ] - p_range[1 ]));
689
+ IF @extschema@.is_date(p_atttype::regtype) THEN
690
+ v_part_name := @extschema@.create_single_range_partition(p_relation
691
+ , p_range[2 ]
692
+ , p_range[2 ] + p_interval::interval);
693
+ ELSE
694
+ EXECUTE format(' SELECT @extschema@.create_single_range_partition($1, $2, $2 + $3::%s)' , p_atttype)
695
+ USING p_relation, p_range[2 ], p_interval
696
+ INTO v_part_name;
697
+ END IF;
674
698
675
699
/* Tell backend to reload configuration */
676
700
PERFORM @extschema@.on_create_partitions(p_relation::regclass::oid );
@@ -682,7 +706,7 @@ LANGUAGE plpgsql;
682
706
683
707
684
708
/*
685
- * Append new partition
709
+ * Prepend new partition
686
710
*/
687
711
CREATE OR REPLACE FUNCTION @extschema@.prepend_partition(p_relation TEXT )
688
712
RETURNS TEXT AS
@@ -691,15 +715,17 @@ DECLARE
691
715
v_attname TEXT ;
692
716
v_atttype TEXT ;
693
717
v_part_name TEXT ;
718
+ v_interval TEXT ;
694
719
BEGIN
695
720
p_relation := @extschema@.validate_relname(p_relation);
696
721
697
- v_attname := attname FROM @extschema@.pathman_config WHERE relname = p_relation;
722
+ SELECT attname, range_interval INTO v_attname, v_interval
723
+ FROM @extschema@.pathman_config WHERE relname = p_relation;
698
724
v_atttype := @extschema@.get_attribute_type_name(p_relation, v_attname);
699
- EXECUTE format( ' SELECT @extschema@.prepend_partition_internal($1, ARRAY[]::%s[]) '
700
- , v_atttype)
725
+
726
+ EXECUTE format( ' SELECT @extschema@.prepend_partition_internal($1, $2, $3, ARRAY[]::%s[]) ' , v_atttype)
701
727
INTO v_part_name
702
- USING p_relation;
728
+ USING p_relation, v_atttype, v_interval ;
703
729
704
730
RETURN v_part_name;
705
731
END
@@ -709,6 +735,8 @@ LANGUAGE plpgsql;
709
735
710
736
CREATE OR REPLACE FUNCTION @extschema@.prepend_partition_internal(
711
737
p_relation TEXT
738
+ , p_atttype TEXT
739
+ , p_interval TEXT
712
740
, p_range ANYARRAY DEFAULT NULL )
713
741
RETURNS TEXT AS
714
742
$$
@@ -717,9 +745,19 @@ DECLARE
717
745
BEGIN
718
746
p_range := @extschema@.get_range_by_idx(p_relation::regclass::oid , 0 , 0 );
719
747
RAISE NOTICE ' Prepending new partition...' ;
720
- v_part_name := @extschema@.create_single_range_partition(p_relation
721
- , p_range[1 ] - (p_range[2 ] - p_range[1 ])
722
- , p_range[1 ]);
748
+ -- v_part_name := @extschema@.create_single_range_partition(p_relation
749
+ -- , p_range[1] - (p_range[2] - p_range[1])
750
+ -- , p_range[1]);
751
+
752
+ IF @extschema@.is_date(p_atttype::regtype) THEN
753
+ v_part_name := @extschema@.create_single_range_partition(p_relation
754
+ , p_range[1 ]
755
+ , p_range[1 ] - p_interval::interval);
756
+ ELSE
757
+ EXECUTE format(' SELECT @extschema@.create_single_range_partition($1, $2, $2 - $3::%s)' , p_atttype)
758
+ USING p_relation, p_range[1 ], p_interval
759
+ INTO v_part_name;
760
+ END IF;
723
761
724
762
/* Tell backend to reload configuration */
725
763
PERFORM @extschema@.on_create_partitions(p_relation::regclass::oid );
@@ -901,29 +939,58 @@ CREATE OR REPLACE FUNCTION @extschema@.append_partitions_on_demand_internal(
901
939
RETURNS OID AS
902
940
$$
903
941
DECLARE
942
+ v_relation TEXT ;
904
943
v_cnt INTEGER := 0 ;
905
944
i INTEGER := 0 ;
906
945
v_part TEXT ;
946
+ v_interval TEXT ;
947
+ v_attname TEXT ;
948
+ v_cur_value p_new_value%TYPE;
949
+ v_next_value p_new_value%TYPE;
950
+ v_is_date BOOLEAN ;
907
951
BEGIN
952
+ v_relation := @extschema@.validate_relname(p_relid::regclass::text );
953
+
954
+ /* get attribute name and interval */
955
+ SELECT attname, range_interval INTO v_attname, v_interval
956
+ FROM @extschema@.pathman_config WHERE relname = v_relation;
957
+
958
+ v_is_date := @extschema@.is_date(pg_typeof(p_new_value)::regtype);
959
+
908
960
IF p_new_value >= p_max THEN
909
- WHILE (p_max + i * (p_max - p_min)) <= p_new_value AND i < 1000
961
+ v_cur_value := p_max;
962
+ WHILE v_cur_value <= p_new_value AND i < 1000
910
963
LOOP
964
+ IF v_is_date THEN
965
+ v_next_value := v_cur_value + v_interval::interval;
966
+ ELSE
967
+ v_next_value := v_cur_value + v_interval;
968
+ END IF;
969
+
911
970
v_part := @extschema@.create_single_range_partition(
912
971
@extschema@.get_schema_qualified_name(p_relid::regclass, ' .' )
913
- , p_max + (i * (p_max - p_min))
914
- , p_max + ((i + 1 ) * (p_max - p_min)) );
972
+ , v_cur_value
973
+ , v_next_value );
915
974
i := i + 1 ;
975
+ v_cur_value := v_next_value;
916
976
RAISE NOTICE ' partition % created' , v_part;
917
977
END LOOP;
918
978
ELSIF p_new_value <= p_min THEN
919
-
920
- WHILE (p_min - i * (p_max - p_min)) >= p_new_value AND i < 1000
979
+ v_cur_value : = p_min;
980
+ WHILE v_cur_value >= p_new_value AND i < 1000
921
981
LOOP
982
+ IF v_is_date THEN
983
+ v_next_value := v_cur_value - v_interval::interval;
984
+ ELSE
985
+ v_next_value := v_cur_value - v_interval;
986
+ END IF;
987
+
922
988
v_part := @extschema@.create_single_range_partition(
923
989
@extschema@.get_schema_qualified_name(p_relid::regclass, ' .' )
924
- , p_min - ((i + 1 ) * (p_max - p_min))
925
- , p_min - (i * (p_max - p_min)) );
990
+ , v_next_value
991
+ , v_cur_value );
926
992
i := i + 1 ;
993
+ v_cur_value := v_next_value;
927
994
RAISE NOTICE ' partition % created' , v_part;
928
995
END LOOP;
929
996
ELSE
0 commit comments