@@ -91,8 +91,8 @@ DECLARE
9191v_rows_countINTEGER ;
9292v_maxp_start_value%TYPE;
9393v_cur_valuep_start_value%TYPE := p_start_value;
94+ v_tablespaceTEXT ;
9495iINTEGER ;
95-
9696BEGIN
9797IF partition_data= true THEN
9898/* Acquire data modification lock*/
@@ -149,12 +149,20 @@ BEGIN
149149INSERT INTO @extschema@.pathman_config (partrel, attname, parttype, range_interval)
150150VALUES (parent_relid, p_attribute,2 , p_interval::TEXT );
151151
152+ /* Determine tablespace of parent table*/
153+ v_tablespace := @extschema@.get_rel_tablespace_name(parent_relid);
154+
152155/* Create first partition*/
153156FOR iIN 1 ..p_count
154157LOOP
155- EXECUTE format(' SELECT @extschema@.create_single_range_partition($1, $2, $3::%s)' ,
156- pg_typeof(p_start_value))
157- USING parent_relid, p_start_value, p_start_value+ p_interval;
158+ EXECUTE
159+ format(' SELECT @extschema@.create_single_range_partition($1, $2, $3::%s, tablespace:=$4)' ,
160+ pg_typeof(p_start_value))
161+ USING
162+ parent_relid,
163+ p_start_value,
164+ p_start_value+ p_interval,
165+ v_tablespace;
158166
159167p_start_value := p_start_value+ p_interval;
160168END LOOP;
@@ -190,6 +198,7 @@ DECLARE
190198v_rows_countINTEGER ;
191199v_maxp_start_value%TYPE;
192200v_cur_valuep_start_value%TYPE := p_start_value;
201+ v_tablespaceTEXT ;
193202iINTEGER ;
194203
195204BEGIN
@@ -250,12 +259,18 @@ BEGIN
250259INSERT INTO @extschema@.pathman_config (partrel, attname, parttype, range_interval)
251260VALUES (parent_relid, p_attribute,2 , p_interval::TEXT );
252261
262+ /* Determine tablespace of parent table*/
263+ v_tablespace := @extschema@.get_rel_tablespace_name(parent_relid);
264+
253265/* create first partition*/
254266FOR iIN 1 ..p_count
255267LOOP
256- PERFORM @extschema@.create_single_range_partition(parent_relid,
257- p_start_value,
258- p_start_value+ p_interval);
268+ PERFORM @extschema@.create_single_range_partition(
269+ parent_relid,
270+ p_start_value,
271+ p_start_value+ p_interval,
272+ tablespace := v_tablespace);
273+
259274p_start_value := p_start_value+ p_interval;
260275END LOOP;
261276
@@ -288,6 +303,7 @@ RETURNS INTEGER AS
288303$$
289304DECLARE
290305part_countINTEGER := 0 ;
306+ v_tablespaceTEXT ;
291307
292308BEGIN
293309IF partition_data= true THEN
@@ -320,11 +336,17 @@ BEGIN
320336INSERT INTO @extschema@.pathman_config (partrel, attname, parttype, range_interval)
321337VALUES (parent_relid, p_attribute,2 , p_interval::TEXT );
322338
339+ /* Determine tablespace of parent table*/
340+ v_tablespace := @extschema@.get_rel_tablespace_name(parent_relid);
341+
323342WHILE p_start_value<= p_end_value
324343LOOP
325- PERFORM @extschema@.create_single_range_partition(parent_relid,
326- p_start_value,
327- p_start_value+ p_interval);
344+ PERFORM @extschema@.create_single_range_partition(
345+ parent_relid,
346+ p_start_value,
347+ p_start_value+ p_interval,
348+ tablespace := v_tablespace);
349+
328350p_start_value := p_start_value+ p_interval;
329351part_count := part_count+ 1 ;
330352END LOOP;
@@ -358,6 +380,7 @@ RETURNS INTEGER AS
358380$$
359381DECLARE
360382part_countINTEGER := 0 ;
383+ v_tablespaceTEXT ;
361384
362385BEGIN
363386IF partition_data= true THEN
@@ -386,11 +409,19 @@ BEGIN
386409INSERT INTO @extschema@.pathman_config (partrel, attname, parttype, range_interval)
387410VALUES (parent_relid, p_attribute,2 , p_interval::TEXT );
388411
412+ /* Determine tablespace of parent table*/
413+ v_tablespace := @extschema@.get_rel_tablespace_name(parent_relid);
414+
389415WHILE p_start_value<= p_end_value
390416LOOP
391- EXECUTE format(' SELECT @extschema@.create_single_range_partition($1, $2, $3::%s);' ,
392- pg_typeof(p_start_value))
393- USING parent_relid, p_start_value, p_start_value+ p_interval;
417+ EXECUTE
418+ format(' SELECT @extschema@.create_single_range_partition($1, $2, $3::%s, tablespace:=$4);' ,
419+ pg_typeof(p_start_value))
420+ USING
421+ parent_relid,
422+ p_start_value,
423+ p_start_value+ p_interval,
424+ v_tablespace;
394425
395426p_start_value := p_start_value+ p_interval;
396427part_count := part_count+ 1 ;
@@ -419,7 +450,8 @@ CREATE OR REPLACE FUNCTION @extschema@.create_single_range_partition(
419450parent_relidREGCLASS,
420451p_start_valueANYELEMENT,
421452p_end_valueANYELEMENT,
422- partition_nameTEXT DEFAULTNULL )
453+ partition_nameTEXT DEFAULTNULL ,
454+ tablespaceTEXT DEFAULTNULL )
423455RETURNSTEXT AS
424456$$
425457DECLARE
@@ -431,7 +463,7 @@ DECLARE
431463v_plain_relnameTEXT ;
432464v_child_relname_existsBOOL;
433465v_seq_nameTEXT ;
434-
466+ v_create_table_query TEXT ;
435467BEGIN
436468v_attname := attnameFROM @extschema@.pathman_config
437469WHERE partrel= parent_relid;
@@ -466,7 +498,15 @@ BEGIN
466498v_child_relname := partition_name;
467499END IF;
468500
469- EXECUTE format(' CREATE TABLE %1$s (LIKE %2$s INCLUDING ALL) INHERITS (%2$s)' ,
501+ v_create_table_query := ' CREATE TABLE %1$s (LIKE %2$s INCLUDING ALL) INHERITS (%2$s)' ;
502+
503+ /* If tablespace is specified then add it to a create query*/
504+ if NOT tablespace ISNULL THEN
505+ v_create_table_query := v_create_table_query|| ' TABLESPACE' || tablespace;
506+ END IF;
507+ RAISE NOTICE' query: %' , v_create_table_query;
508+
509+ EXECUTE format(v_create_table_query,
470510 v_child_relname,
471511 parent_relid::TEXT );
472512
@@ -708,7 +748,8 @@ $$ LANGUAGE plpgsql;
708748*/
709749CREATEOR REPLACE FUNCTION @extschema@.append_range_partition(
710750parent_relidREGCLASS,
711- partition_nameTEXT DEFAULTNULL )
751+ partition_nameTEXT DEFAULTNULL ,
752+ tablespaceTEXT DEFAULTNULL )
712753RETURNSTEXT AS
713754$$
714755DECLARE
@@ -734,13 +775,14 @@ BEGIN
734775
735776EXECUTE
736777format(
737- ' SELECT @extschema@.append_partition_internal($1, $2, $3, ARRAY[]::%s[], $4)' ,
778+ ' SELECT @extschema@.append_partition_internal($1, $2, $3, ARRAY[]::%s[], $4, $5 )' ,
738779v_atttype)
739780USING
740781parent_relid,
741782v_atttype,
742783v_interval,
743- partition_name
784+ partition_name,
785+ tablespace
744786INTO
745787v_part_name;
746788
@@ -762,7 +804,8 @@ CREATE OR REPLACE FUNCTION @extschema@.append_partition_internal(
762804p_atttypeTEXT ,
763805p_intervalTEXT ,
764806p_rangeANYARRAY DEFAULTNULL ,
765- partition_nameTEXT DEFAULTNULL )
807+ partition_nameTEXT DEFAULTNULL ,
808+ tablespaceTEXT DEFAULTNULL )
766809RETURNSTEXT AS
767810$$
768811DECLARE
@@ -773,6 +816,11 @@ BEGIN
773816RAISE EXCEPTION' Cannot append to empty partitions set' ;
774817END IF;
775818
819+ /* If tablespace isn't specified then choose parent's tablespace*/
820+ IF tablespace ISNULL THEN
821+ tablespace := @extschema@.get_rel_tablespace_name(parent_relid);
822+ END IF;
823+
776824p_range := @extschema@.get_range_by_idx(parent_relid,- 1 ,0 );
777825
778826IF @extschema@.is_date_type(p_atttype::regtype) THEN
@@ -784,13 +832,14 @@ BEGIN
784832ELSE
785833EXECUTE
786834format(
787- ' SELECT @extschema@.create_single_range_partition($1, $2, $2 + $3::%s, $4)' ,
835+ ' SELECT @extschema@.create_single_range_partition($1, $2, $2 + $3::%s, $4, $5 )' ,
788836p_atttype)
789837USING
790838parent_relid,
791839p_range[2 ],
792840p_interval,
793- partition_name
841+ partition_name,
842+ tablespace
794843INTO
795844v_part_name;
796845END IF;
@@ -806,7 +855,8 @@ LANGUAGE plpgsql;
806855*/
807856CREATEOR REPLACE FUNCTION @extschema@.prepend_range_partition(
808857parent_relidREGCLASS,
809- partition_nameTEXT DEFAULTNULL )
858+ partition_nameTEXT DEFAULTNULL ,
859+ tablespaceTEXT DEFAULTNULL )
810860RETURNSTEXT AS
811861$$
812862DECLARE
@@ -829,13 +879,14 @@ BEGIN
829879
830880EXECUTE
831881format(
832- ' SELECT @extschema@.prepend_partition_internal($1, $2, $3, ARRAY[]::%s[], $4)' ,
882+ ' SELECT @extschema@.prepend_partition_internal($1, $2, $3, ARRAY[]::%s[], $4, $5 )' ,
833883v_atttype)
834884USING
835885parent_relid,
836886v_atttype,
837887v_interval,
838- partition_name
888+ partition_name,
889+ tablespace
839890INTO
840891v_part_name;
841892
@@ -857,7 +908,8 @@ CREATE OR REPLACE FUNCTION @extschema@.prepend_partition_internal(
857908p_atttypeTEXT ,
858909p_intervalTEXT ,
859910p_rangeANYARRAY DEFAULTNULL ,
860- partition_nameTEXT DEFAULTNULL )
911+ partition_nameTEXT DEFAULTNULL ,
912+ tablespaceTEXT DEFAULTNULL )
861913RETURNSTEXT AS
862914$$
863915DECLARE
@@ -868,6 +920,11 @@ BEGIN
868920RAISE EXCEPTION' Cannot prepend to empty partitions set' ;
869921END IF;
870922
923+ /* If tablespace isn't specified then choose parent's tablespace*/
924+ IF tablespace ISNULL THEN
925+ tablespace := @extschema@.get_rel_tablespace_name(parent_relid);
926+ END IF;
927+
871928p_range := @extschema@.get_range_by_idx(parent_relid,0 ,0 );
872929
873930IF @extschema@.is_date_type(p_atttype::regtype) THEN
@@ -879,13 +936,14 @@ BEGIN
879936ELSE
880937EXECUTE
881938format(
882- ' SELECT @extschema@.create_single_range_partition($1, $2 - $3::%s, $2, $4)' ,
939+ ' SELECT @extschema@.create_single_range_partition($1, $2 - $3::%s, $2, $4, $5 )' ,
883940p_atttype)
884941USING
885942parent_relid,
886943p_range[1 ],
887944p_interval,
888- partition_name
945+ partition_name,
946+ tablespace
889947INTO
890948v_part_name;
891949END IF;
@@ -903,7 +961,8 @@ CREATE OR REPLACE FUNCTION @extschema@.add_range_partition(
903961parent_relidREGCLASS,
904962p_start_valueANYELEMENT,
905963p_end_valueANYELEMENT,
906- partition_nameTEXT DEFAULTNULL )
964+ partition_nameTEXT DEFAULTNULL ,
965+ tablespaceTEXT DEFAULTNULL )
907966RETURNSTEXT AS
908967$$
909968DECLARE
@@ -923,11 +982,17 @@ BEGIN
923982RAISE EXCEPTION' Specified range overlaps with existing partitions' ;
924983END IF;
925984
985+ /* If tablespace isn't specified then choose parent's tablespace*/
986+ IF tablespace ISNULL THEN
987+ tablespace := @extschema@.get_rel_tablespace_name(parent_relid);
988+ END IF;
989+
926990/* Create new partition*/
927991v_part_name := @extschema@.create_single_range_partition(parent_relid,
928992 p_start_value,
929993 p_end_value,
930- partition_name);
994+ partition_name,
995+ tablespace);
931996PERFORM @extschema@.on_update_partitions(parent_relid);
932997
933998RETURN v_part_name;