@@ -31,11 +31,13 @@ CREATE TABLE IF NOT EXISTS @extschema@.pathman_config (
3131 *partrel - regclass (relation type, stored as Oid)
3232 *enable_parent - add parent table to plan
3333 *auto - enable automatic partition creation
34+ *init_callback - cb to be executed on partition creation
3435*/
3536CREATE TABLE IF NOT EXISTS @extschema@.pathman_config_params (
3637partrelREGCLASSNOT NULL PRIMARY KEY ,
3738enable_parentBOOLEAN NOT NULL DEFAULT TRUE,
38- autoBOOLEAN NOT NULL DEFAULT TRUE
39+ autoBOOLEAN NOT NULL DEFAULT TRUE,
40+ init_callbackREGPROCEDURENOT NULL DEFAULT0
3941);
4042CREATE UNIQUE INDEX i_pathman_config_params
4143ON @extschema@.pathman_config_params(partrel);
@@ -85,15 +87,15 @@ BEGIN
8587RETURNcount (* )FROM pg_inheritsWHERE inhparent= relation;
8688END
8789$$
88- LANGUAGE plpgsql;
90+ LANGUAGE plpgsql STRICT ;
8991
9092/*
9193 * Add a row describing the optional parameter to pathman_config_params.
9294*/
9395CREATEOR REPLACE FUNCTION @extschema@.pathman_set_param(
9496relationREGCLASS,
9597paramTEXT ,
96- valueBOOLEAN )
98+ valueANYELEMENT )
9799RETURNS VOIDAS
98100$$
99101BEGIN
106108LANGUAGE plpgsql;
107109
108110/*
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.
122112*/
123- CREATEOR REPLACE FUNCTION @extschema@.disable_parent(relation REGCLASS)
113+ CREATEOR REPLACE FUNCTION @extschema@.set_enable_parent(
114+ relationREGCLASS,
115+ valueBOOLEAN )
124116RETURNS VOIDAS
125117$$
126118BEGIN
127- PERFORM @extschema@.pathman_set_param(relation,' enable_parent' ,False );
119+ PERFORM @extschema@.pathman_set_param(relation,' enable_parent' ,value );
128120END
129121$$
130- LANGUAGE plpgsql;
122+ LANGUAGE plpgsql STRICT ;
131123
132124/*
133- * Enable automatic partition creation.
125+ * Enable\disable automatic partition creation.
134126*/
135- CREATEOR REPLACE FUNCTION @extschema@.enable_auto(relation REGCLASS)
127+ CREATEOR REPLACE FUNCTION @extschema@.set_auto(
128+ relationREGCLASS,
129+ valueBOOLEAN )
136130RETURNS VOIDAS
137131$$
138132BEGIN
139- PERFORM @extschema@.pathman_set_param(relation,' auto' ,True );
133+ PERFORM @extschema@.pathman_set_param(relation,' auto' ,value );
140134END
141135$$
142- LANGUAGE plpgsql;
136+ LANGUAGE plpgsql STRICT ;
143137
144138/*
145- *Disable automatic partition creation.
139+ *Set partition creation callback
146140*/
147- CREATEOR REPLACE FUNCTION @extschema@.disable_auto(relation REGCLASS)
141+ CREATEOR REPLACE FUNCTION @extschema@.set_part_init_callback(
142+ relationREGCLASS,
143+ callbackREGPROC)
148144RETURNS VOIDAS
149145$$
150146BEGIN
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);
152149END
153150$$
154151LANGUAGE plpgsql;
@@ -201,6 +198,7 @@ DECLARE
201198v_limit_clauseTEXT := ' ' ;
202199v_where_clauseTEXT := ' ' ;
203200ctidsTID[];
201+
204202BEGIN
205203SELECT attname INTO v_attr
206204FROM @extschema@.pathman_configWHERE partrel= p_relation;
@@ -276,7 +274,7 @@ BEGIN
276274RETURN;
277275END
278276$$
279- LANGUAGE plpgsql
277+ LANGUAGE plpgsql STRICT
280278SET pg_pathman .enable_partitionfilter = on ;/* ensures that PartitionFilter is ON*/
281279
282280/*
@@ -296,7 +294,7 @@ BEGIN
296294PERFORM @extschema@.on_remove_partitions(parent_relid);
297295END
298296$$
299- LANGUAGE plpgsql;
297+ LANGUAGE plpgsql STRICT ;
300298
301299/*
302300 * Aggregates several common relation checks before partitioning.
@@ -365,7 +363,7 @@ BEGIN
365363INTO schema, relname;
366364END
367365$$
368- LANGUAGE plpgsql;
366+ LANGUAGE plpgsql STRICT ;
369367
370368/*
371369 * Returns schema-qualified name for table
@@ -384,7 +382,7 @@ BEGIN
384382WHERE oid = cls::oid );
385383END
386384$$
387- LANGUAGE plpgsql;
385+ LANGUAGE plpgsql STRICT ;
388386
389387/*
390388 * Validates relation name. It must be schema qualified
@@ -484,7 +482,7 @@ BEGIN
484482EXECUTE format(' DROP FUNCTION IF EXISTS %s() CASCADE' ,
485483 @extschema@.build_update_trigger_func_name(parent_relid));
486484END
487- $$ LANGUAGE plpgsql;
485+ $$ LANGUAGE plpgsql STRICT ;
488486
489487/*
490488 * Drop partitions
@@ -569,7 +567,7 @@ BEGIN
569567 pg_get_constraintdef(rec .conid ));
570568END LOOP;
571569END
572- $$ LANGUAGE plpgsql;
570+ $$ LANGUAGE plpgsql STRICT ;
573571
574572
575573/*
@@ -703,3 +701,41 @@ LANGUAGE C STRICT;
703701CREATEOR REPLACE FUNCTION @extschema@.debug_capture()
704702RETURNS VOIDAS ' pg_pathman' ,' debug_capture'
705703LANGUAGE 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;