6060END
6161$$ LANGUAGE plpgsql;
6262
63+
64+ CREATE OR REPLACE FUNCTION @extschema@.prepare_for_partitioning(
65+ parent_relid REGCLASS,
66+ attribute TEXT ,
67+ partition_data BOOLEAN )
68+ RETURNS VOID AS
69+ $$
70+ BEGIN
71+ PERFORM @extschema@.validate_relname(parent_relid);
72+
73+ IF partition_data = true THEN
74+ /* Acquire data modification lock */
75+ PERFORM @extschema@.prevent_relation_modification(parent_relid);
76+ ELSE
77+ /* Acquire lock on parent */
78+ PERFORM @extschema@.lock_partitioned_relation(parent_relid);
79+ END IF;
80+
81+ attribute := lower (attribute);
82+ PERFORM @extschema@.common_relation_checks(parent_relid, attribute);
83+ END
84+ $$ LANGUAGE plpgsql;
85+
6386/*
6487 * Creates RANGE partitions for specified relation based on datetime attribute
6588 */
@@ -81,18 +104,8 @@ DECLARE
81104 i INTEGER ;
82105
83106BEGIN
84- PERFORM @extschema@.validate_relname(parent_relid);
85-
86- IF partition_data = true THEN
87- /* Acquire data modification lock */
88- PERFORM @extschema@.prevent_relation_modification(parent_relid);
89- ELSE
90- /* Acquire lock on parent */
91- PERFORM @extschema@.lock_partitioned_relation(parent_relid);
92- END IF;
93-
94107 attribute := lower (attribute);
95- PERFORM @extschema@.common_relation_checks (parent_relid, attribute);
108+ PERFORM @extschema@.prepare_for_partitioning (parent_relid, attribute, partition_data );
96109
97110 IF p_count < 0 THEN
98111 RAISE EXCEPTION ' "p_count" must not be less than 0' ;
@@ -196,18 +209,8 @@ DECLARE
196209 i INTEGER ;
197210
198211BEGIN
199- PERFORM @extschema@.validate_relname(parent_relid);
200-
201- IF partition_data = true THEN
202- /* Acquire data modification lock */
203- PERFORM @extschema@.prevent_relation_modification(parent_relid);
204- ELSE
205- /* Acquire lock on parent */
206- PERFORM @extschema@.lock_partitioned_relation(parent_relid);
207- END IF;
208-
209212 attribute := lower (attribute);
210- PERFORM @extschema@.common_relation_checks (parent_relid, attribute);
213+ PERFORM @extschema@.prepare_for_partitioning (parent_relid, attribute, partition_data );
211214
212215 IF p_count < 0 THEN
213216 RAISE EXCEPTION ' partitions count must not be less than zero' ;
@@ -304,18 +307,8 @@ DECLARE
304307 part_count INTEGER := 0 ;
305308
306309BEGIN
307- PERFORM @extschema@.validate_relname(parent_relid);
308-
309- IF partition_data = true THEN
310- /* Acquire data modification lock */
311- PERFORM @extschema@.prevent_relation_modification(parent_relid);
312- ELSE
313- /* Acquire lock on parent */
314- PERFORM @extschema@.lock_partitioned_relation(parent_relid);
315- END IF;
316-
317310 attribute := lower (attribute);
318- PERFORM @extschema@.common_relation_checks (parent_relid, attribute);
311+ PERFORM @extschema@.prepare_for_partitioning (parent_relid, attribute, partition_data );
319312
320313 /* Check boundaries */
321314 PERFORM @extschema@.check_boundaries(parent_relid,
@@ -374,18 +367,8 @@ DECLARE
374367 part_count INTEGER := 0 ;
375368
376369BEGIN
377- PERFORM @extschema@.validate_relname(parent_relid);
378-
379- IF partition_data = true THEN
380- /* Acquire data modification lock */
381- PERFORM @extschema@.prevent_relation_modification(parent_relid);
382- ELSE
383- /* Acquire lock on parent */
384- PERFORM @extschema@.lock_partitioned_relation(parent_relid);
385- END IF;
386-
387370 attribute := lower (attribute);
388- PERFORM @extschema@.common_relation_checks (parent_relid, attribute);
371+ PERFORM @extschema@.prepare_for_partitioning (parent_relid, attribute, partition_data );
389372
390373 /* Check boundaries */
391374 PERFORM @extschema@.check_boundaries(parent_relid,
@@ -435,7 +418,10 @@ $$ LANGUAGE plpgsql;
435418CREATE OR REPLACE FUNCTION @extschema@.create_range_partitions2(
436419 parent_relid REGCLASS,
437420 attribute TEXT ,
438- bounds ANYARRAY)
421+ bounds ANYARRAY,
422+ relnames TEXT [] DEFAULT NULL ,
423+ tablespaces TEXT [] DEFAULT NULL ,
424+ partition_data BOOLEAN DEFAULT TRUE)
439425RETURNS INTEGER AS
440426$$
441427DECLARE
@@ -449,18 +435,8 @@ BEGIN
449435 RAISE EXCEPTION ' Bounds array must have at least two values' ;
450436 END IF;
451437
452- PERFORM @extschema@.validate_relname(parent_relid);
453-
454- IF partition_data = true THEN
455- /* Acquire data modification lock */
456- PERFORM @extschema@.prevent_relation_modification(parent_relid);
457- ELSE
458- /* Acquire lock on parent */
459- PERFORM @extschema@.lock_partitioned_relation(parent_relid);
460- END IF;
461-
462438 attribute := lower (attribute);
463- PERFORM @extschema@.common_relation_checks (parent_relid, attribute);
439+ PERFORM @extschema@.prepare_for_partitioning (parent_relid, attribute, partition_data );
464440
465441 /* Check boundaries */
466442 PERFORM @extschema@.check_boundaries(parent_relid,
@@ -476,7 +452,10 @@ BEGIN
476452 FROM @extschema@.get_plain_schema_and_relname(parent_relid);
477453
478454 /* Create partitions */
479- part_count := @extschema@.create_range_partitions_internal(parent_relid, bounds);
455+ part_count := @extschema@.create_range_partitions_internal(parent_relid,
456+ bounds,
457+ relnames,
458+ tablespaces);
480459
481460 /* Notify backend about changes */
482461 PERFORM @extschema@.on_create_partitions(parent_relid);
@@ -489,15 +468,17 @@ BEGIN
489468 PERFORM @extschema@.set_enable_parent(parent_relid, true);
490469 END IF;
491470
492- RETURN 0 ;
471+ RETURN part_count ;
493472END
494473$$
495474LANGUAGE plpgsql;
496475
497476
498477CREATE OR REPLACE FUNCTION @extschema@.create_range_partitions_internal(
499478 parent_relid REGCLASS,
500- value ANYARRAY)
479+ bounds ANYARRAY,
480+ relnames TEXT [],
481+ tablespaces TEXT [])
501482RETURNS REGCLASS AS ' pg_pathman' , ' create_range_partitions_internal'
502483LANGUAGE C;
503484
@@ -640,7 +621,8 @@ BEGIN
640621
641622 v_atttype := @extschema@.get_partition_key_type(parent_relid);
642623
643- IF NOT @extschema@.is_operator_supported(v_atttype, ' +' ) THEN
624+ IF NOT @extschema@.is_date_type(v_atttype) AND
625+ NOT @extschema@.is_operator_supported(v_atttype, ' +' ) THEN
644626 RAISE EXCEPTION ' Type % doesn' ' t support ' ' +' ' operator' , v_atttype::regtype;
645627 END IF;
646628
@@ -749,7 +731,8 @@ BEGIN
749731
750732 v_atttype := @extschema@.get_partition_key_type(parent_relid);
751733
752- IF NOT @extschema@.is_operator_supported(v_atttype, ' -' ) THEN
734+ IF NOT @extschema@.is_date_type(v_atttype) AND
735+ NOT @extschema@.is_operator_supported(v_atttype, ' -' ) THEN
753736 RAISE EXCEPTION ' Type % doesn' ' t support ' ' -' ' operator' , v_atttype::regtype;
754737 END IF;
755738
0 commit comments