@@ -91,8 +91,8 @@ DECLARE
91
91
v_rows_countINTEGER ;
92
92
v_maxp_start_value%TYPE;
93
93
v_cur_valuep_start_value%TYPE := p_start_value;
94
+ v_tablespaceTEXT ;
94
95
iINTEGER ;
95
-
96
96
BEGIN
97
97
IF partition_data= true THEN
98
98
/* Acquire data modification lock*/
@@ -149,12 +149,20 @@ BEGIN
149
149
INSERT INTO @extschema@.pathman_config (partrel, attname, parttype, range_interval)
150
150
VALUES (parent_relid, p_attribute,2 , p_interval::TEXT );
151
151
152
+ /* Determine tablespace of parent table*/
153
+ v_tablespace := @extschema@.get_rel_tablespace_name(parent_relid);
154
+
152
155
/* Create first partition*/
153
156
FOR iIN 1 ..p_count
154
157
LOOP
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;
158
166
159
167
p_start_value := p_start_value+ p_interval;
160
168
END LOOP;
@@ -190,6 +198,7 @@ DECLARE
190
198
v_rows_countINTEGER ;
191
199
v_maxp_start_value%TYPE;
192
200
v_cur_valuep_start_value%TYPE := p_start_value;
201
+ v_tablespaceTEXT ;
193
202
iINTEGER ;
194
203
195
204
BEGIN
@@ -250,12 +259,18 @@ BEGIN
250
259
INSERT INTO @extschema@.pathman_config (partrel, attname, parttype, range_interval)
251
260
VALUES (parent_relid, p_attribute,2 , p_interval::TEXT );
252
261
262
+ /* Determine tablespace of parent table*/
263
+ v_tablespace := @extschema@.get_rel_tablespace_name(parent_relid);
264
+
253
265
/* create first partition*/
254
266
FOR iIN 1 ..p_count
255
267
LOOP
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
+
259
274
p_start_value := p_start_value+ p_interval;
260
275
END LOOP;
261
276
@@ -288,6 +303,7 @@ RETURNS INTEGER AS
288
303
$$
289
304
DECLARE
290
305
part_countINTEGER := 0 ;
306
+ v_tablespaceTEXT ;
291
307
292
308
BEGIN
293
309
IF partition_data= true THEN
@@ -320,11 +336,17 @@ BEGIN
320
336
INSERT INTO @extschema@.pathman_config (partrel, attname, parttype, range_interval)
321
337
VALUES (parent_relid, p_attribute,2 , p_interval::TEXT );
322
338
339
+ /* Determine tablespace of parent table*/
340
+ v_tablespace := @extschema@.get_rel_tablespace_name(parent_relid);
341
+
323
342
WHILE p_start_value<= p_end_value
324
343
LOOP
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
+
328
350
p_start_value := p_start_value+ p_interval;
329
351
part_count := part_count+ 1 ;
330
352
END LOOP;
@@ -358,6 +380,7 @@ RETURNS INTEGER AS
358
380
$$
359
381
DECLARE
360
382
part_countINTEGER := 0 ;
383
+ v_tablespaceTEXT ;
361
384
362
385
BEGIN
363
386
IF partition_data= true THEN
@@ -386,11 +409,19 @@ BEGIN
386
409
INSERT INTO @extschema@.pathman_config (partrel, attname, parttype, range_interval)
387
410
VALUES (parent_relid, p_attribute,2 , p_interval::TEXT );
388
411
412
+ /* Determine tablespace of parent table*/
413
+ v_tablespace := @extschema@.get_rel_tablespace_name(parent_relid);
414
+
389
415
WHILE p_start_value<= p_end_value
390
416
LOOP
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;
394
425
395
426
p_start_value := p_start_value+ p_interval;
396
427
part_count := part_count+ 1 ;
@@ -419,7 +450,8 @@ CREATE OR REPLACE FUNCTION @extschema@.create_single_range_partition(
419
450
parent_relidREGCLASS,
420
451
p_start_valueANYELEMENT,
421
452
p_end_valueANYELEMENT,
422
- partition_nameTEXT DEFAULTNULL )
453
+ partition_nameTEXT DEFAULTNULL ,
454
+ tablespaceTEXT DEFAULTNULL )
423
455
RETURNSTEXT AS
424
456
$$
425
457
DECLARE
@@ -431,7 +463,7 @@ DECLARE
431
463
v_plain_relnameTEXT ;
432
464
v_child_relname_existsBOOL;
433
465
v_seq_nameTEXT ;
434
-
466
+ v_create_table_query TEXT ;
435
467
BEGIN
436
468
v_attname := attnameFROM @extschema@.pathman_config
437
469
WHERE partrel= parent_relid;
@@ -466,7 +498,15 @@ BEGIN
466
498
v_child_relname := partition_name;
467
499
END IF;
468
500
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,
470
510
v_child_relname,
471
511
parent_relid::TEXT );
472
512
@@ -708,7 +748,8 @@ $$ LANGUAGE plpgsql;
708
748
*/
709
749
CREATEOR REPLACE FUNCTION @extschema@.append_range_partition(
710
750
parent_relidREGCLASS,
711
- partition_nameTEXT DEFAULTNULL )
751
+ partition_nameTEXT DEFAULTNULL ,
752
+ tablespaceTEXT DEFAULTNULL )
712
753
RETURNSTEXT AS
713
754
$$
714
755
DECLARE
@@ -734,13 +775,14 @@ BEGIN
734
775
735
776
EXECUTE
736
777
format(
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 )' ,
738
779
v_atttype)
739
780
USING
740
781
parent_relid,
741
782
v_atttype,
742
783
v_interval,
743
- partition_name
784
+ partition_name,
785
+ tablespace
744
786
INTO
745
787
v_part_name;
746
788
@@ -762,7 +804,8 @@ CREATE OR REPLACE FUNCTION @extschema@.append_partition_internal(
762
804
p_atttypeTEXT ,
763
805
p_intervalTEXT ,
764
806
p_rangeANYARRAY DEFAULTNULL ,
765
- partition_nameTEXT DEFAULTNULL )
807
+ partition_nameTEXT DEFAULTNULL ,
808
+ tablespaceTEXT DEFAULTNULL )
766
809
RETURNSTEXT AS
767
810
$$
768
811
DECLARE
@@ -773,6 +816,11 @@ BEGIN
773
816
RAISE EXCEPTION' Cannot append to empty partitions set' ;
774
817
END IF;
775
818
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
+
776
824
p_range := @extschema@.get_range_by_idx(parent_relid,- 1 ,0 );
777
825
778
826
IF @extschema@.is_date_type(p_atttype::regtype) THEN
@@ -784,13 +832,14 @@ BEGIN
784
832
ELSE
785
833
EXECUTE
786
834
format(
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 )' ,
788
836
p_atttype)
789
837
USING
790
838
parent_relid,
791
839
p_range[2 ],
792
840
p_interval,
793
- partition_name
841
+ partition_name,
842
+ tablespace
794
843
INTO
795
844
v_part_name;
796
845
END IF;
@@ -806,7 +855,8 @@ LANGUAGE plpgsql;
806
855
*/
807
856
CREATEOR REPLACE FUNCTION @extschema@.prepend_range_partition(
808
857
parent_relidREGCLASS,
809
- partition_nameTEXT DEFAULTNULL )
858
+ partition_nameTEXT DEFAULTNULL ,
859
+ tablespaceTEXT DEFAULTNULL )
810
860
RETURNSTEXT AS
811
861
$$
812
862
DECLARE
@@ -829,13 +879,14 @@ BEGIN
829
879
830
880
EXECUTE
831
881
format(
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 )' ,
833
883
v_atttype)
834
884
USING
835
885
parent_relid,
836
886
v_atttype,
837
887
v_interval,
838
- partition_name
888
+ partition_name,
889
+ tablespace
839
890
INTO
840
891
v_part_name;
841
892
@@ -857,7 +908,8 @@ CREATE OR REPLACE FUNCTION @extschema@.prepend_partition_internal(
857
908
p_atttypeTEXT ,
858
909
p_intervalTEXT ,
859
910
p_rangeANYARRAY DEFAULTNULL ,
860
- partition_nameTEXT DEFAULTNULL )
911
+ partition_nameTEXT DEFAULTNULL ,
912
+ tablespaceTEXT DEFAULTNULL )
861
913
RETURNSTEXT AS
862
914
$$
863
915
DECLARE
@@ -868,6 +920,11 @@ BEGIN
868
920
RAISE EXCEPTION' Cannot prepend to empty partitions set' ;
869
921
END IF;
870
922
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
+
871
928
p_range := @extschema@.get_range_by_idx(parent_relid,0 ,0 );
872
929
873
930
IF @extschema@.is_date_type(p_atttype::regtype) THEN
@@ -879,13 +936,14 @@ BEGIN
879
936
ELSE
880
937
EXECUTE
881
938
format(
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 )' ,
883
940
p_atttype)
884
941
USING
885
942
parent_relid,
886
943
p_range[1 ],
887
944
p_interval,
888
- partition_name
945
+ partition_name,
946
+ tablespace
889
947
INTO
890
948
v_part_name;
891
949
END IF;
@@ -903,7 +961,8 @@ CREATE OR REPLACE FUNCTION @extschema@.add_range_partition(
903
961
parent_relidREGCLASS,
904
962
p_start_valueANYELEMENT,
905
963
p_end_valueANYELEMENT,
906
- partition_nameTEXT DEFAULTNULL )
964
+ partition_nameTEXT DEFAULTNULL ,
965
+ tablespaceTEXT DEFAULTNULL )
907
966
RETURNSTEXT AS
908
967
$$
909
968
DECLARE
@@ -923,11 +982,17 @@ BEGIN
923
982
RAISE EXCEPTION' Specified range overlaps with existing partitions' ;
924
983
END IF;
925
984
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
+
926
990
/* Create new partition*/
927
991
v_part_name := @extschema@.create_single_range_partition(parent_relid,
928
992
p_start_value,
929
993
p_end_value,
930
- partition_name);
994
+ partition_name,
995
+ tablespace);
931
996
PERFORM @extschema@.on_update_partitions(parent_relid);
932
997
933
998
RETURN v_part_name;