@@ -505,15 +505,17 @@ BEGIN
505
505
partition_name);
506
506
507
507
/* Copy data */
508
- v_cond := @extschema@.build_range_condition(v_attname, split_value, p_range[2 ]);
508
+ v_cond := @extschema@.build_range_condition(v_new_partition::regclass,
509
+ v_attname, split_value, p_range[2 ]);
509
510
EXECUTE format(' WITH part_data AS (DELETE FROM %s WHERE %s RETURNING *)
510
511
INSERT INTO %s SELECT * FROM part_data' ,
511
512
partition::TEXT ,
512
513
v_cond,
513
514
v_new_partition);
514
515
515
516
/* Alter original partition */
516
- v_cond := @extschema@.build_range_condition(v_attname, p_range[1 ], split_value);
517
+ v_cond := @extschema@.build_range_condition(partition::regclass,
518
+ v_attname, p_range[1 ], split_value);
517
519
v_check_name := @extschema@.build_check_constraint_name(partition, v_attname);
518
520
519
521
EXECUTE format(' ALTER TABLE %s DROP CONSTRAINT %s' ,
@@ -612,6 +614,8 @@ DECLARE
612
614
v_attname TEXT ;
613
615
v_atttype REGTYPE;
614
616
v_check_name TEXT ;
617
+ v_lower_bound dummy%TYPE;
618
+ v_upper_bound dummy%TYPE;
615
619
616
620
BEGIN
617
621
SELECT attname FROM @extschema@.pathman_config
@@ -642,13 +646,28 @@ BEGIN
642
646
partition1::TEXT ,
643
647
v_check_name);
644
648
649
+ /* Determine left bound */
650
+ IF p_range[1 ] IS NULL OR p_range[3 ] IS NULL THEN
651
+ v_lower_bound := NULL ;
652
+ ELSE
653
+ v_lower_bound := least(p_range[1 ], p_range[3 ]);
654
+ END IF;
655
+
656
+ /* Determine right bound */
657
+ IF p_range[2 ] IS NULL OR p_range[4 ] IS NULL THEN
658
+ v_upper_bound := NULL ;
659
+ ELSE
660
+ v_upper_bound := greatest(p_range[2 ], p_range[4 ]);
661
+ END IF;
662
+
645
663
/* and create a new one */
646
664
EXECUTE format(' ALTER TABLE %s ADD CONSTRAINT %s CHECK (%s)' ,
647
665
partition1::TEXT ,
648
666
v_check_name,
649
- @extschema@.build_range_condition(v_attname,
650
- least(p_range[1 ], p_range[3 ]),
651
- greatest(p_range[2 ], p_range[4 ])));
667
+ @extschema@.build_range_condition(partition1,
668
+ v_attname,
669
+ v_lower_bound,
670
+ v_upper_bound));
652
671
653
672
/* Copy data from second partition to the first one */
654
673
EXECUTE format(' WITH part_data AS (DELETE FROM %s RETURNING *)
@@ -745,6 +764,10 @@ BEGIN
745
764
USING parent_relid
746
765
INTO p_range;
747
766
767
+ IF p_range[2 ] IS NULL THEN
768
+ RAISE EXCEPTION ' Cannot append partition because last partition is half open' ;
769
+ END IF;
770
+
748
771
IF @extschema@.is_date_type(p_atttype) THEN
749
772
v_part_name := @extschema@.create_single_range_partition(
750
773
parent_relid,
@@ -855,6 +878,10 @@ BEGIN
855
878
USING parent_relid
856
879
INTO p_range;
857
880
881
+ IF p_range[1 ] IS NULL THEN
882
+ RAISE EXCEPTION ' Cannot prepend partition because first partition is half open' ;
883
+ END IF;
884
+
858
885
IF @extschema@.is_date_type(p_atttype) THEN
859
886
v_part_name := @extschema@.create_single_range_partition(
860
887
parent_relid,
@@ -1045,7 +1072,8 @@ BEGIN
1045
1072
EXECUTE format(' ALTER TABLE %s ADD CONSTRAINT %s CHECK (%s)' ,
1046
1073
partition::TEXT ,
1047
1074
@extschema@.build_check_constraint_name(partition, v_attname),
1048
- @extschema@.build_range_condition(v_attname,
1075
+ @extschema@.build_range_condition(partition,
1076
+ v_attname,
1049
1077
start_value,
1050
1078
end_value));
1051
1079
@@ -1230,6 +1258,7 @@ SET client_min_messages = WARNING;
1230
1258
* Construct CHECK constraint condition for a range partition.
1231
1259
*/
1232
1260
CREATE OR REPLACE FUNCTION @extschema@.build_range_condition(
1261
+ p_relid REGCLASS,
1233
1262
p_attname TEXT ,
1234
1263
start_value ANYELEMENT,
1235
1264
end_value ANYELEMENT)
0 commit comments