@@ -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 (
3637 partrel REGCLASS NOT NULL PRIMARY KEY ,
3738 enable_parent BOOLEAN NOT NULL DEFAULT TRUE,
38- auto BOOLEAN NOT NULL DEFAULT TRUE
39+ auto BOOLEAN NOT NULL DEFAULT TRUE,
40+ init_callback REGPROCEDURE NOT NULL DEFAULT 0
3941);
4042CREATE UNIQUE INDEX i_pathman_config_params
4143ON @extschema@.pathman_config_params(partrel);
@@ -85,15 +87,15 @@ BEGIN
8587 RETURN count (* ) FROM pg_inherits WHERE 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 */
9395CREATE OR REPLACE FUNCTION @extschema@.pathman_set_param(
9496 relation REGCLASS,
9597 param TEXT ,
96- value BOOLEAN )
98+ value ANYELEMENT )
9799RETURNS VOID AS
98100$$
99101BEGIN
106108LANGUAGE plpgsql;
107109
108110/*
109- * Include parent relation into query plan's for specified relation.
110- */
111- CREATE OR REPLACE FUNCTION @extschema@.enable_parent(relation REGCLASS)
112- RETURNS VOID AS
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- CREATE OR REPLACE FUNCTION @extschema@.disable_parent(relation REGCLASS)
113+ CREATE OR REPLACE FUNCTION @extschema@.set_enable_parent(
114+ relation REGCLASS,
115+ value BOOLEAN )
124116RETURNS VOID AS
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- CREATE OR REPLACE FUNCTION @extschema@.enable_auto(relation REGCLASS)
127+ CREATE OR REPLACE FUNCTION @extschema@.set_auto(
128+ relation REGCLASS,
129+ value BOOLEAN )
136130RETURNS VOID AS
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- CREATE OR REPLACE FUNCTION @extschema@.disable_auto(relation REGCLASS)
141+ CREATE OR REPLACE FUNCTION @extschema@.set_part_init_callback(
142+ relation REGCLASS,
143+ callback REGPROC)
148144RETURNS VOID AS
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
201198 v_limit_clause TEXT := ' ' ;
202199 v_where_clause TEXT := ' ' ;
203200 ctids TID[];
201+
204202BEGIN
205203 SELECT attname INTO v_attr
206204 FROM @extschema@.pathman_config WHERE partrel = p_relation;
@@ -276,7 +274,7 @@ BEGIN
276274 RETURN;
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
296294 PERFORM @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
365363 INTO 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
384382 WHERE 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
484482 EXECUTE 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 ));
570568 END LOOP;
571569END
572- $$ LANGUAGE plpgsql;
570+ $$ LANGUAGE plpgsql STRICT ;
573571
574572
575573/*
@@ -703,3 +701,41 @@ LANGUAGE C STRICT;
703701CREATE OR REPLACE FUNCTION @extschema@.debug_capture()
704702RETURNS VOID AS ' pg_pathman' , ' debug_capture'
705703LANGUAGE C STRICT;
704+
705+ /*
706+ * Return tablespace name for specified relation.
707+ */
708+ CREATE OR REPLACE FUNCTION @extschema@.get_rel_tablespace_name(relation REGCLASS)
709+ RETURNS TEXT 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+ CREATE OR REPLACE FUNCTION @extschema@.validate_on_partition_created_callback(callback REGPROC)
717+ RETURNS VOID AS ' pg_pathman' , ' validate_on_part_init_callback_pl'
718+ LANGUAGE C STRICT;
719+
720+
721+ /*
722+ * Invoke init_callback on RANGE partition.
723+ */
724+ CREATE OR REPLACE FUNCTION @extschema@.invoke_on_partition_created_callback(
725+ parent_relid REGCLASS,
726+ partition REGCLASS,
727+ init_callback REGPROCEDURE,
728+ start_value ANYELEMENT,
729+ end_value ANYELEMENT)
730+ RETURNS VOID AS ' pg_pathman' , ' invoke_on_partition_created_callback'
731+ LANGUAGE C;
732+
733+ /*
734+ * Invoke init_callback on HASH partition.
735+ */
736+ CREATE OR REPLACE FUNCTION @extschema@.invoke_on_partition_created_callback(
737+ parent_relid REGCLASS,
738+ partition REGCLASS,
739+ init_callback REGPROCEDURE)
740+ RETURNS VOID AS ' pg_pathman' , ' invoke_on_partition_created_callback'
741+ LANGUAGE C;
0 commit comments