9898DECLARE
9999v_rows_countBIGINT ;
100100v_atttypeREGTYPE;
101- v_tablespaceTEXT ;
102101v_maxstart_value%TYPE;
103102v_cur_valuestart_value%TYPE := start_value;
104103end_valuestart_value%TYPE;
@@ -163,10 +162,12 @@ BEGIN
163162
164163IF p_count!= 0 THEN
165164part_count := @extschema@.create_range_partitions_internal(
166- parent_relid,
167- @extschema@.generate_range_bounds(start_value, p_interval, p_count),
168- NULL ,
169- NULL );
165+ parent_relid,
166+ @extschema@.generate_range_bounds(start_value,
167+ p_interval,
168+ p_count),
169+ NULL ,
170+ NULL );
170171END IF;
171172
172173/* Notify backend about changes*/
@@ -284,49 +285,49 @@ END
284285$$ LANGUAGE plpgsql;
285286
286287/*
287- * Creates RANGE partitions for specifiedrange
288+ * Creates RANGE partitions for specifiedrelation based on bounds array
288289*/
289- CREATEOR REPLACE FUNCTION @extschema@.create_partitions_from_range (
290+ CREATEOR REPLACE FUNCTION @extschema@.create_range_partitions (
290291parent_relidREGCLASS,
291292attributeTEXT ,
292- start_valueANYELEMENT ,
293- end_valueANYELEMENT ,
294- p_intervalANYELEMENT ,
293+ boundsANYARRAY ,
294+ partition_names TEXT [] DEFAULT NULL ,
295+ tablespaces TEXT [] DEFAULT NULL ,
295296partition_dataBOOLEAN DEFAULT TRUE)
296297RETURNSINTEGER AS
297298$$
298299DECLARE
299- part_countINTEGER := 0 ;
300-
300+ part_countINTEGER ;
301301BEGIN
302+ IF array_ndims(bounds)> 1 THEN
303+ RAISE EXCEPTION' Bounds array must be a one dimensional array' ;
304+ END IF;
305+
306+ IF array_length(bounds,1 )< 2 THEN
307+ RAISE EXCEPTION' Bounds array must have at least two values' ;
308+ END IF;
309+
302310attribute := lower (attribute);
303311PERFORM @extschema@.prepare_for_partitioning(parent_relid, attribute, partition_data);
304312
305313/* Check boundaries*/
306314PERFORM @extschema@.check_boundaries(parent_relid,
307315 attribute,
308- start_value ,
309- end_value );
316+ bounds[ 0 ] ,
317+ bounds[array_length(bounds, 1 ) - 1 ] );
310318
311- /* Insert new entry to pathman config*/
312319INSERT INTO @extschema@.pathman_config (partrel, attname, parttype, range_interval)
313- VALUES (parent_relid, attribute,2 ,p_interval:: TEXT );
320+ VALUES (parent_relid, attribute,2 ,NULL );
314321
315322/* Create sequence for child partitions names*/
316323PERFORM @extschema@.create_or_replace_sequence(parent_relid)
317324FROM @extschema@.get_plain_schema_and_relname(parent_relid);
318325
319- WHILE start_value<= end_value
320- LOOP
321- PERFORM @extschema@.create_single_range_partition(
322- parent_relid,
323- start_value,
324- start_value+ p_interval,
325- tablespace := @extschema@.get_tablespace(parent_relid));
326-
327- start_value := start_value+ p_interval;
328- part_count := part_count+ 1 ;
329- END LOOP;
326+ /* Create partitions*/
327+ part_count := @extschema@.create_range_partitions_internal(parent_relid,
328+ bounds,
329+ partition_names,
330+ tablespaces);
330331
331332/* Notify backend about changes*/
332333PERFORM @extschema@.on_create_partitions(parent_relid);
@@ -339,19 +340,20 @@ BEGIN
339340PERFORM @extschema@.set_enable_parent(parent_relid, true);
340341END IF;
341342
342- RETURN part_count;/* number of created partitions */
343+ RETURN part_count;
343344END
344- $$ LANGUAGE plpgsql;
345+ $$
346+ LANGUAGE plpgsql;
345347
346348/*
347- * Creates RANGE partitions for specified range based on datetime attribute
349+ * Creates RANGE partitions for specified range
348350*/
349351CREATEOR REPLACE FUNCTION @extschema@.create_partitions_from_range(
350352parent_relidREGCLASS,
351353attributeTEXT ,
352354start_valueANYELEMENT,
353355end_valueANYELEMENT,
354- p_intervalINTERVAL ,
356+ p_intervalANYELEMENT ,
355357partition_dataBOOLEAN DEFAULT TRUE)
356358RETURNSINTEGER AS
357359$$
@@ -378,14 +380,11 @@ BEGIN
378380
379381WHILE start_value<= end_value
380382LOOP
381- EXECUTE
382- format(' SELECT @extschema@.create_single_range_partition($1, $2, $3::%s, tablespace:=$4);' ,
383- @extschema@.get_base_type(pg_typeof(start_value))::TEXT )
384- USING
383+ PERFORM @extschema@.create_single_range_partition(
385384parent_relid,
386385start_value,
387386start_value+ p_interval,
388- @extschema@.get_tablespace(parent_relid);
387+ tablespace : = @extschema@.get_tablespace(parent_relid) );
389388
390389start_value := start_value+ p_interval;
391390part_count := part_count+ 1 ;
@@ -406,48 +405,53 @@ BEGIN
406405END
407406$$ LANGUAGE plpgsql;
408407
409-
410- CREATEOR REPLACE FUNCTION @extschema@.create_range_partitions2(
408+ /*
409+ * Creates RANGE partitions for specified range based on datetime attribute
410+ */
411+ CREATEOR REPLACE FUNCTION @extschema@.create_partitions_from_range(
411412parent_relidREGCLASS,
412413attributeTEXT ,
413- boundsANYARRAY ,
414- relnames TEXT [] DEFAULT NULL ,
415- tablespaces TEXT [] DEFAULT NULL ,
414+ start_valueANYELEMENT ,
415+ end_valueANYELEMENT ,
416+ p_intervalINTERVAL ,
416417partition_dataBOOLEAN DEFAULT TRUE)
417418RETURNSINTEGER AS
418419$$
419420DECLARE
420- part_countINTEGER ;
421- BEGIN
422- IF array_ndims(bounds)> 1 THEN
423- RAISE EXCEPTION' Bounds array must be a one dimensional array' ;
424- END IF;
425-
426- IF array_length(bounds,1 )< 2 THEN
427- RAISE EXCEPTION' Bounds array must have at least two values' ;
428- END IF;
421+ part_countINTEGER := 0 ;
429422
423+ BEGIN
430424attribute := lower (attribute);
431425PERFORM @extschema@.prepare_for_partitioning(parent_relid, attribute, partition_data);
432426
433427/* Check boundaries*/
434428PERFORM @extschema@.check_boundaries(parent_relid,
435429 attribute,
436- bounds[ 0 ] ,
437- bounds[array_length(bounds, 1 ) - 1 ] );
430+ start_value ,
431+ end_value );
438432
433+ /* Insert new entry to pathman config*/
439434INSERT INTO @extschema@.pathman_config (partrel, attname, parttype, range_interval)
440- VALUES (parent_relid, attribute,2 ,NULL );
435+ VALUES (parent_relid, attribute,2 ,p_interval:: TEXT );
441436
442437/* Create sequence for child partitions names*/
443438PERFORM @extschema@.create_or_replace_sequence(parent_relid)
444439FROM @extschema@.get_plain_schema_and_relname(parent_relid);
445440
446- /* Create partitions*/
447- part_count := @extschema@.create_range_partitions_internal(parent_relid,
448- bounds,
449- relnames,
450- tablespaces);
441+ WHILE start_value<= end_value
442+ LOOP
443+ EXECUTE
444+ format(' SELECT @extschema@.create_single_range_partition($1, $2, $3::%s, tablespace:=$4);' ,
445+ @extschema@.get_base_type(pg_typeof(start_value))::TEXT )
446+ USING
447+ parent_relid,
448+ start_value,
449+ start_value+ p_interval,
450+ @extschema@.get_tablespace(parent_relid);
451+
452+ start_value := start_value+ p_interval;
453+ part_count := part_count+ 1 ;
454+ END LOOP;
451455
452456/* Notify backend about changes*/
453457PERFORM @extschema@.on_create_partitions(parent_relid);
@@ -460,10 +464,10 @@ BEGIN
460464PERFORM @extschema@.set_enable_parent(parent_relid, true);
461465END IF;
462466
463- RETURN part_count;
467+ RETURN part_count;/* number of created partitions */
464468END
465- $$
466- LANGUAGE plpgsql;
469+ $$ LANGUAGE plpgsql;
470+
467471
468472/*
469473 * Split RANGE partition
@@ -843,7 +847,7 @@ LANGUAGE plpgsql;
843847CREATEOR REPLACE FUNCTION @extschema@.add_range_partitions(
844848parent_relidREGCLASS,
845849boundsANYARRAY,
846- relnames TEXT [] DEFAULTNULL ,
850+ partition_names TEXT [] DEFAULTNULL ,
847851tablespacesTEXT [] DEFAULTNULL )
848852RETURNSINTEGER AS
849853$$
@@ -858,7 +862,7 @@ BEGIN
858862/* Create partitions*/
859863part_count := @extschema@.create_range_partitions_internal(parent_relid,
860864 bounds,
861- relnames ,
865+ partition_names ,
862866 tablespaces);
863867
864868/* Notify backend about changes*/
@@ -1094,7 +1098,7 @@ LANGUAGE C STRICT;
10941098CREATEOR REPLACE FUNCTION @extschema@.create_range_partitions_internal(
10951099parent_relidREGCLASS,
10961100boundsANYARRAY,
1097- relnames TEXT [],
1101+ partition_names TEXT [],
10981102tablespacesTEXT [])
10991103RETURNS REGCLASSAS ' pg_pathman' ,' create_range_partitions_internal'
11001104LANGUAGE C;