Skip to content

Commit 0731552

Browse files
committed
add the partition name parameter to some PL functions
1 parent ee432b0 commit 0731552

File tree

1 file changed

+107
-60
lines changed

1 file changed

+107
-60
lines changed

range.sql

Lines changed: 107 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,8 @@ $$ LANGUAGE plpgsql;
396396
CREATE OR REPLACE FUNCTION @extschema@.create_single_range_partition(
397397
parent_relid REGCLASS,
398398
p_start_value ANYELEMENT,
399-
p_end_value ANYELEMENT)
399+
p_end_value ANYELEMENT,
400+
partition_name TEXT DEFAULT NULL)
400401
RETURNS TEXT AS
401402
$$
402403
DECLARE
@@ -423,34 +424,42 @@ BEGIN
423424

424425
v_seq_name := @extschema@.get_sequence_name(v_plain_schema, v_plain_relname);
425426

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_relname AND
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 IS NULL 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_relname AND
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;
442447

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));
454463

455464
RETURN v_child_relname;
456465
END
@@ -463,6 +472,7 @@ SET client_min_messages = WARNING;
463472
CREATE OR REPLACE FUNCTION @extschema@.split_range_partition(
464473
p_partition REGCLASS,
465474
p_value ANYELEMENT,
475+
partition_name TEXT DEFAULT NULL,
466476
OUT p_range ANYARRAY)
467477
RETURNS ANYARRAY AS
468478
$$
@@ -669,7 +679,8 @@ $$ LANGUAGE plpgsql;
669679
* Append new partition
670680
*/
671681
CREATE OR REPLACE FUNCTION @extschema@.append_range_partition(
672-
parent_relid REGCLASS)
682+
parent_relid REGCLASS,
683+
partition_name TEXT DEFAULT NULL)
673684
RETURNS TEXT AS
674685
$$
675686
DECLARE
@@ -690,14 +701,20 @@ BEGIN
690701

691702
v_atttype := @extschema@.get_attribute_type_name(parent_relid, v_attname);
692703

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;
697715

698716
/* Invalidate cache */
699717
PERFORM @extschema@.on_update_partitions(parent_relid);
700-
701718
RETURN v_part_name;
702719

703720
EXCEPTION WHEN others THEN
@@ -711,7 +728,8 @@ CREATE OR REPLACE FUNCTION @extschema@.append_partition_internal(
711728
parent_relid REGCLASS,
712729
p_atttype TEXT,
713730
p_interval TEXT,
714-
p_range ANYARRAY DEFAULT NULL)
731+
p_range ANYARRAY DEFAULT NULL,
732+
partition_name TEXT DEFAULT NULL)
715733
RETURNS TEXT AS
716734
$$
717735
DECLARE
@@ -721,14 +739,23 @@ BEGIN
721739
p_range := @extschema@.get_range_by_idx(parent_relid, -1, 0);
722740

723741
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);
727747
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;
732759
END IF;
733760

734761
RETURN v_part_name;
@@ -741,7 +768,8 @@ LANGUAGE plpgsql;
741768
* Prepend new partition
742769
*/
743770
CREATE OR REPLACE FUNCTION @extschema@.prepend_range_partition(
744-
parent_relid REGCLASS)
771+
parent_relid REGCLASS,
772+
partition_name TEXT DEFAULT NULL)
745773
RETURNS TEXT AS
746774
$$
747775
DECLARE
@@ -762,14 +790,20 @@ BEGIN
762790

763791
v_atttype := @extschema@.get_attribute_type_name(parent_relid, v_attname);
764792

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;
769804

770805
/* Invalidate cache */
771806
PERFORM @extschema@.on_update_partitions(parent_relid);
772-
773807
RETURN v_part_name;
774808

775809
EXCEPTION WHEN others THEN
@@ -783,7 +817,8 @@ CREATE OR REPLACE FUNCTION @extschema@.prepend_partition_internal(
783817
parent_relid REGCLASS,
784818
p_atttype TEXT,
785819
p_interval TEXT,
786-
p_range ANYARRAY DEFAULT NULL)
820+
p_range ANYARRAY DEFAULT NULL,
821+
partition_name TEXT DEFAULT NULL)
787822
RETURNS TEXT AS
788823
$$
789824
DECLARE
@@ -793,14 +828,23 @@ BEGIN
793828
p_range := @extschema@.get_range_by_idx(parent_relid, 0, 0);
794829

795830
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);
799836
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;
804848
END IF;
805849

806850
RETURN v_part_name;
@@ -815,7 +859,8 @@ LANGUAGE plpgsql;
815859
CREATE OR REPLACE FUNCTION @extschema@.add_range_partition(
816860
parent_relid REGCLASS,
817861
p_start_value ANYELEMENT,
818-
p_end_value ANYELEMENT)
862+
p_end_value ANYELEMENT,
863+
partition_name TEXT DEFAULT NULL)
819864
RETURNS TEXT AS
820865
$$
821866
DECLARE
@@ -832,9 +877,11 @@ BEGIN
832877
END IF;
833878

834879
/* 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);
838885
PERFORM @extschema@.on_update_partitions(parent_relid);
839886

840887
RETURN v_part_name;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy