@@ -396,7 +396,8 @@ $$ LANGUAGE plpgsql;
396
396
CREATEOR REPLACE FUNCTION @extschema@.create_single_range_partition(
397
397
parent_relidREGCLASS,
398
398
p_start_valueANYELEMENT,
399
- p_end_valueANYELEMENT)
399
+ p_end_valueANYELEMENT,
400
+ partition_nameTEXT DEFAULTNULL )
400
401
RETURNSTEXT AS
401
402
$$
402
403
DECLARE
@@ -423,34 +424,42 @@ BEGIN
423
424
424
425
v_seq_name := @extschema@.get_sequence_name(v_plain_schema, v_plain_relname);
425
426
426
- /* Get next value from sequence*/
427
- LOOP
428
- v_part_num := nextval(v_seq_name);
429
- v_plain_child_relname := format(' %s_%s' , v_plain_relname, v_part_num);
430
- v_child_relname := format(' %s.%s' ,
431
- quote_ident(v_plain_schema),
432
- quote_ident(v_plain_child_relname));
433
-
434
- v_child_relname_exists := count (* )> 0
435
- FROM pg_class
436
- WHERE relname= v_plain_child_relnameAND
437
- relnamespace= v_plain_schema::regnamespace
438
- LIMIT 1 ;
439
-
440
- EXIT WHEN v_child_relname_exists= false;
441
- END LOOP;
427
+ IF partition_name ISNULL THEN
428
+ /* Get next value from sequence*/
429
+ LOOP
430
+ v_part_num := nextval(v_seq_name);
431
+ v_plain_child_relname := format(' %s_%s' , v_plain_relname, v_part_num);
432
+ v_child_relname := format(' %s.%s' ,
433
+ quote_ident(v_plain_schema),
434
+ quote_ident(v_plain_child_relname));
435
+
436
+ v_child_relname_exists := count (* )> 0
437
+ FROM pg_class
438
+ WHERE relname= v_plain_child_relnameAND
439
+ relnamespace= v_plain_schema::regnamespace
440
+ LIMIT 1 ;
441
+
442
+ EXIT WHEN v_child_relname_exists= false;
443
+ END LOOP;
444
+ ELSE
445
+ v_child_relname := partition_name;
446
+ END IF;
442
447
443
- EXECUTE format(' CREATE TABLE %1$s (LIKE %2$s INCLUDING ALL) INHERITS (%2$s)' ,
444
- v_child_relname,
445
- @extschema@.get_schema_qualified_name(parent_relid));
446
-
447
- EXECUTE format(' ALTER TABLE %s ADD CONSTRAINT %s CHECK (%s)' ,
448
- v_child_relname,
449
- @extschema@.build_check_constraint_name(v_child_relname::regclass,
450
- v_attname),
451
- @extschema@.build_range_condition(v_attname,
452
- p_start_value,
453
- p_end_value));
448
+ EXECUTE format(
449
+ ' CREATE TABLE %1$s (LIKE %2$s INCLUDING ALL) INHERITS (%2$s)' ,
450
+ v_child_relname,
451
+ @extschema@.get_schema_qualified_name(parent_relid));
452
+
453
+ EXECUTE format(
454
+ ' ALTER TABLE %s ADD CONSTRAINT %s CHECK (%s)' ,
455
+ v_child_relname,
456
+ @extschema@.build_check_constraint_name(
457
+ v_child_relname::regclass,
458
+ v_attname),
459
+ @extschema@.build_range_condition(
460
+ v_attname,
461
+ p_start_value,
462
+ p_end_value));
454
463
455
464
RETURN v_child_relname;
456
465
END
@@ -463,6 +472,7 @@ SET client_min_messages = WARNING;
463
472
CREATEOR REPLACE FUNCTION @extschema@.split_range_partition(
464
473
p_partitionREGCLASS,
465
474
p_valueANYELEMENT,
475
+ partition_nameTEXT DEFAULTNULL ,
466
476
OUT p_rangeANYARRAY)
467
477
RETURNS ANYARRAYAS
468
478
$$
@@ -669,7 +679,8 @@ $$ LANGUAGE plpgsql;
669
679
* Append new partition
670
680
*/
671
681
CREATEOR REPLACE FUNCTION @extschema@.append_range_partition(
672
- parent_relidREGCLASS)
682
+ parent_relidREGCLASS,
683
+ partition_nameTEXT DEFAULTNULL )
673
684
RETURNSTEXT AS
674
685
$$
675
686
DECLARE
@@ -690,14 +701,20 @@ BEGIN
690
701
691
702
v_atttype := @extschema@.get_attribute_type_name(parent_relid, v_attname);
692
703
693
- EXECUTE format(' SELECT @extschema@.append_partition_internal($1, $2, $3, ARRAY[]::%s[])' ,
694
- v_atttype)
695
- INTO v_part_name
696
- USING parent_relid, v_atttype, v_interval;
704
+ EXECUTE
705
+ format(
706
+ ' SELECT @extschema@.append_partition_internal($1, $2, $3, ARRAY[]::%s[], $4)' ,
707
+ v_atttype)
708
+ USING
709
+ parent_relid,
710
+ v_atttype,
711
+ v_interval,
712
+ partition_name
713
+ INTO
714
+ v_part_name;
697
715
698
716
/* Invalidate cache*/
699
717
PERFORM @extschema@.on_update_partitions(parent_relid);
700
-
701
718
RETURN v_part_name;
702
719
703
720
EXCEPTION WHEN others THEN
@@ -711,7 +728,8 @@ CREATE OR REPLACE FUNCTION @extschema@.append_partition_internal(
711
728
parent_relidREGCLASS,
712
729
p_atttypeTEXT ,
713
730
p_intervalTEXT ,
714
- p_rangeANYARRAY DEFAULTNULL )
731
+ p_rangeANYARRAY DEFAULTNULL ,
732
+ partition_nameTEXT DEFAULTNULL )
715
733
RETURNSTEXT AS
716
734
$$
717
735
DECLARE
@@ -721,14 +739,23 @@ BEGIN
721
739
p_range := @extschema@.get_range_by_idx(parent_relid,- 1 ,0 );
722
740
723
741
IF @extschema@.is_date_type(p_atttype::regtype) THEN
724
- v_part_name := @extschema@.create_single_range_partition(parent_relid
725
- , p_range[2 ]
726
- , p_range[2 ]+ p_interval::interval);
742
+ v_part_name := @extschema@.create_single_range_partition(
743
+ parent_relid,
744
+ p_range[2 ],
745
+ p_range[2 ]+ p_interval::interval,
746
+ partition_name);
727
747
ELSE
728
- EXECUTE format(' SELECT @extschema@.create_single_range_partition($1, $2, $2 + $3::%s)' ,
729
- p_atttype)
730
- USING parent_relid, p_range[2 ], p_interval
731
- INTO v_part_name;
748
+ EXECUTE
749
+ format(
750
+ ' SELECT @extschema@.create_single_range_partition($1, $2, $2 + $3::%s, $4)' ,
751
+ p_atttype)
752
+ USING
753
+ parent_relid,
754
+ p_range[2 ],
755
+ p_interval,
756
+ partition_name
757
+ INTO
758
+ v_part_name;
732
759
END IF;
733
760
734
761
RETURN v_part_name;
@@ -741,7 +768,8 @@ LANGUAGE plpgsql;
741
768
* Prepend new partition
742
769
*/
743
770
CREATEOR REPLACE FUNCTION @extschema@.prepend_range_partition(
744
- parent_relidREGCLASS)
771
+ parent_relidREGCLASS,
772
+ partition_nameTEXT DEFAULTNULL )
745
773
RETURNSTEXT AS
746
774
$$
747
775
DECLARE
@@ -762,14 +790,20 @@ BEGIN
762
790
763
791
v_atttype := @extschema@.get_attribute_type_name(parent_relid, v_attname);
764
792
765
- EXECUTE format(' SELECT @extschema@.prepend_partition_internal($1, $2, $3, ARRAY[]::%s[])' ,
766
- v_atttype)
767
- INTO v_part_name
768
- USING parent_relid, v_atttype, v_interval;
793
+ EXECUTE
794
+ format(
795
+ ' SELECT @extschema@.prepend_partition_internal($1, $2, $3, ARRAY[]::%s[], $4)' ,
796
+ v_atttype)
797
+ USING
798
+ parent_relid,
799
+ v_atttype,
800
+ v_interval,
801
+ partition_name
802
+ INTO
803
+ v_part_name;
769
804
770
805
/* Invalidate cache*/
771
806
PERFORM @extschema@.on_update_partitions(parent_relid);
772
-
773
807
RETURN v_part_name;
774
808
775
809
EXCEPTION WHEN others THEN
@@ -783,7 +817,8 @@ CREATE OR REPLACE FUNCTION @extschema@.prepend_partition_internal(
783
817
parent_relidREGCLASS,
784
818
p_atttypeTEXT ,
785
819
p_intervalTEXT ,
786
- p_rangeANYARRAY DEFAULTNULL )
820
+ p_rangeANYARRAY DEFAULTNULL ,
821
+ partition_nameTEXT DEFAULTNULL )
787
822
RETURNSTEXT AS
788
823
$$
789
824
DECLARE
@@ -793,14 +828,23 @@ BEGIN
793
828
p_range := @extschema@.get_range_by_idx(parent_relid,0 ,0 );
794
829
795
830
IF @extschema@.is_date_type(p_atttype::regtype) THEN
796
- v_part_name := @extschema@.create_single_range_partition(parent_relid,
797
- p_range[1 ]- p_interval::interval,
798
- p_range[1 ]);
831
+ v_part_name := @extschema@.create_single_range_partition(
832
+ parent_relid,
833
+ p_range[1 ]- p_interval::interval,
834
+ p_range[1 ],
835
+ partition_name);
799
836
ELSE
800
- EXECUTE format(' SELECT @extschema@.create_single_range_partition($1, $2 - $3::%s, $2)' ,
801
- p_atttype)
802
- USING parent_relid, p_range[1 ], p_interval
803
- INTO v_part_name;
837
+ EXECUTE
838
+ format(
839
+ ' SELECT @extschema@.create_single_range_partition($1, $2 - $3::%s, $2, $4)' ,
840
+ p_atttype)
841
+ USING
842
+ parent_relid,
843
+ p_range[1 ],
844
+ p_interval,
845
+ partition_name
846
+ INTO
847
+ v_part_name;
804
848
END IF;
805
849
806
850
RETURN v_part_name;
@@ -815,7 +859,8 @@ LANGUAGE plpgsql;
815
859
CREATEOR REPLACE FUNCTION @extschema@.add_range_partition(
816
860
parent_relidREGCLASS,
817
861
p_start_valueANYELEMENT,
818
- p_end_valueANYELEMENT)
862
+ p_end_valueANYELEMENT,
863
+ partition_nameTEXT DEFAULTNULL )
819
864
RETURNSTEXT AS
820
865
$$
821
866
DECLARE
@@ -832,9 +877,11 @@ BEGIN
832
877
END IF;
833
878
834
879
/* Create new partition*/
835
- v_part_name := @extschema@.create_single_range_partition(parent_relid,
836
- p_start_value,
837
- p_end_value);
880
+ v_part_name := @extschema@.create_single_range_partition(
881
+ parent_relid,
882
+ p_start_value,
883
+ p_end_value,
884
+ partition_name);
838
885
PERFORM @extschema@.on_update_partitions(parent_relid);
839
886
840
887
RETURN v_part_name;