@@ -31,11 +31,13 @@ CREATE TABLE IF NOT EXISTS @extschema@.pathman_config (
31
31
*partrel - regclass (relation type, stored as Oid)
32
32
*enable_parent - add parent table to plan
33
33
*auto - enable automatic partition creation
34
+ *init_callback - cb to be executed on partition creation
34
35
*/
35
36
CREATE TABLE IF NOT EXISTS @extschema@.pathman_config_params (
36
37
partrelREGCLASSNOT NULL PRIMARY KEY ,
37
38
enable_parentBOOLEAN NOT NULL DEFAULT TRUE,
38
- autoBOOLEAN NOT NULL DEFAULT TRUE
39
+ autoBOOLEAN NOT NULL DEFAULT TRUE,
40
+ init_callbackREGPROCEDURENOT NULL DEFAULT0
39
41
);
40
42
CREATE UNIQUE INDEX i_pathman_config_params
41
43
ON @extschema@.pathman_config_params(partrel);
@@ -85,15 +87,15 @@ BEGIN
85
87
RETURNcount (* )FROM pg_inheritsWHERE inhparent= relation;
86
88
END
87
89
$$
88
- LANGUAGE plpgsql;
90
+ LANGUAGE plpgsql STRICT ;
89
91
90
92
/*
91
93
* Add a row describing the optional parameter to pathman_config_params.
92
94
*/
93
95
CREATEOR REPLACE FUNCTION @extschema@.pathman_set_param(
94
96
relationREGCLASS,
95
97
paramTEXT ,
96
- valueBOOLEAN )
98
+ valueANYELEMENT )
97
99
RETURNS VOIDAS
98
100
$$
99
101
BEGIN
106
108
LANGUAGE plpgsql;
107
109
108
110
/*
109
- * Include parent relation into query plan's for specified relation.
110
- */
111
- CREATEOR REPLACE FUNCTION @extschema@.enable_parent(relation REGCLASS)
112
- RETURNS VOIDAS
113
- $$
114
- BEGIN
115
- PERFORM @extschema@.pathman_set_param(relation,' enable_parent' , True);
116
- END
117
- $$
118
- LANGUAGE plpgsql;
119
-
120
- /*
121
- * Do not include parent relation into query plan's for specified relation.
111
+ * Include\exclude parent relation in query plan.
122
112
*/
123
- CREATEOR REPLACE FUNCTION @extschema@.disable_parent(relation REGCLASS)
113
+ CREATEOR REPLACE FUNCTION @extschema@.set_enable_parent(
114
+ relationREGCLASS,
115
+ valueBOOLEAN )
124
116
RETURNS VOIDAS
125
117
$$
126
118
BEGIN
127
- PERFORM @extschema@.pathman_set_param(relation,' enable_parent' ,False );
119
+ PERFORM @extschema@.pathman_set_param(relation,' enable_parent' ,value );
128
120
END
129
121
$$
130
- LANGUAGE plpgsql;
122
+ LANGUAGE plpgsql STRICT ;
131
123
132
124
/*
133
- * Enable automatic partition creation.
125
+ * Enable\disable automatic partition creation.
134
126
*/
135
- CREATEOR REPLACE FUNCTION @extschema@.enable_auto(relation REGCLASS)
127
+ CREATEOR REPLACE FUNCTION @extschema@.set_auto(
128
+ relationREGCLASS,
129
+ valueBOOLEAN )
136
130
RETURNS VOIDAS
137
131
$$
138
132
BEGIN
139
- PERFORM @extschema@.pathman_set_param(relation,' auto' ,True );
133
+ PERFORM @extschema@.pathman_set_param(relation,' auto' ,value );
140
134
END
141
135
$$
142
- LANGUAGE plpgsql;
136
+ LANGUAGE plpgsql STRICT ;
143
137
144
138
/*
145
- *Disable automatic partition creation.
139
+ *Set partition creation callback
146
140
*/
147
- CREATEOR REPLACE FUNCTION @extschema@.disable_auto(relation REGCLASS)
141
+ CREATEOR REPLACE FUNCTION @extschema@.set_part_init_callback(
142
+ relationREGCLASS,
143
+ callbackREGPROC)
148
144
RETURNS VOIDAS
149
145
$$
150
146
BEGIN
151
- PERFORM @extschema@.pathman_set_param(relation,' auto' , False);
147
+ PERFORM @extschema@.validate_on_partition_created_callback(callback);
148
+ PERFORM @extschema@.pathman_set_param(relation,' init_callback' , callback);
152
149
END
153
150
$$
154
151
LANGUAGE plpgsql;
@@ -201,6 +198,7 @@ DECLARE
201
198
v_limit_clauseTEXT := ' ' ;
202
199
v_where_clauseTEXT := ' ' ;
203
200
ctidsTID[];
201
+
204
202
BEGIN
205
203
SELECT attname INTO v_attr
206
204
FROM @extschema@.pathman_configWHERE partrel= p_relation;
@@ -276,7 +274,7 @@ BEGIN
276
274
RETURN;
277
275
END
278
276
$$
279
- LANGUAGE plpgsql
277
+ LANGUAGE plpgsql STRICT
280
278
SET pg_pathman .enable_partitionfilter = on ;/* ensures that PartitionFilter is ON*/
281
279
282
280
/*
@@ -296,7 +294,7 @@ BEGIN
296
294
PERFORM @extschema@.on_remove_partitions(parent_relid);
297
295
END
298
296
$$
299
- LANGUAGE plpgsql;
297
+ LANGUAGE plpgsql STRICT ;
300
298
301
299
/*
302
300
* Aggregates several common relation checks before partitioning.
@@ -365,7 +363,7 @@ BEGIN
365
363
INTO schema, relname;
366
364
END
367
365
$$
368
- LANGUAGE plpgsql;
366
+ LANGUAGE plpgsql STRICT ;
369
367
370
368
/*
371
369
* Returns schema-qualified name for table
@@ -384,7 +382,7 @@ BEGIN
384
382
WHERE oid = cls::oid );
385
383
END
386
384
$$
387
- LANGUAGE plpgsql;
385
+ LANGUAGE plpgsql STRICT ;
388
386
389
387
/*
390
388
* Validates relation name. It must be schema qualified
@@ -484,7 +482,7 @@ BEGIN
484
482
EXECUTE format(' DROP FUNCTION IF EXISTS %s() CASCADE' ,
485
483
@extschema@.build_update_trigger_func_name(parent_relid));
486
484
END
487
- $$ LANGUAGE plpgsql;
485
+ $$ LANGUAGE plpgsql STRICT ;
488
486
489
487
/*
490
488
* Drop partitions
@@ -569,7 +567,7 @@ BEGIN
569
567
pg_get_constraintdef(rec .conid ));
570
568
END LOOP;
571
569
END
572
- $$ LANGUAGE plpgsql;
570
+ $$ LANGUAGE plpgsql STRICT ;
573
571
574
572
575
573
/*
@@ -703,3 +701,41 @@ LANGUAGE C STRICT;
703
701
CREATEOR REPLACE FUNCTION @extschema@.debug_capture()
704
702
RETURNS VOIDAS ' pg_pathman' ,' debug_capture'
705
703
LANGUAGE C STRICT;
704
+
705
+ /*
706
+ * Return tablespace name for specified relation.
707
+ */
708
+ CREATEOR REPLACE FUNCTION @extschema@.get_rel_tablespace_name(relation REGCLASS)
709
+ RETURNSTEXT AS ' pg_pathman' ,' get_rel_tablespace_name'
710
+ LANGUAGE C STRICT;
711
+
712
+ /*
713
+ * Checks that callback function meets specific requirements. Particularly it
714
+ * must have the only JSONB argument and VOID return type.
715
+ */
716
+ CREATEOR REPLACE FUNCTION @extschema@.validate_on_partition_created_callback(callback REGPROC)
717
+ RETURNS VOIDAS ' pg_pathman' ,' validate_on_part_init_callback_pl'
718
+ LANGUAGE C STRICT;
719
+
720
+
721
+ /*
722
+ * Invoke init_callback on RANGE partition.
723
+ */
724
+ CREATEOR REPLACE FUNCTION @extschema@.invoke_on_partition_created_callback(
725
+ parent_relidREGCLASS,
726
+ partitionREGCLASS,
727
+ init_callbackREGPROCEDURE,
728
+ start_valueANYELEMENT,
729
+ end_valueANYELEMENT)
730
+ RETURNS VOIDAS ' pg_pathman' ,' invoke_on_partition_created_callback'
731
+ LANGUAGE C;
732
+
733
+ /*
734
+ * Invoke init_callback on HASH partition.
735
+ */
736
+ CREATEOR REPLACE FUNCTION @extschema@.invoke_on_partition_created_callback(
737
+ parent_relidREGCLASS,
738
+ partitionREGCLASS,
739
+ init_callbackREGPROCEDURE)
740
+ RETURNS VOIDAS ' pg_pathman' ,' invoke_on_partition_created_callback'
741
+ LANGUAGE C;