@@ -34,15 +34,43 @@ CREATE TABLE IF NOT EXISTS @extschema@.pathman_config_params (
3434CREATE UNIQUE INDEX i_pathman_config_params
3535ON @extschema@.pathman_config_params(partrel);
3636
37+ /*
38+ * Invalidate relcache every time someone changes parameters config
39+ */
40+ CREATE OR REPLACE FUNCTION @extschema@.pathman_config_params_trigger_func()
41+ RETURNS TRIGGER AS
42+ $$
43+ BEGIN
44+ IF TG_OP IN (' INSERT' , ' UPDATE' ) THEN
45+ PERFORM @extschema@.invalidate_relcache(NEW .partrel );
46+ END IF;
47+
48+ IF TG_OP IN (' UPDATE' , ' DELETE' ) THEN
49+ PERFORM @extschema@.invalidate_relcache(OLD .partrel );
50+ END IF;
51+
52+ IF TG_OP = ' DELETE' THEN
53+ RETURN OLD;
54+ ELSE
55+ RETURN NEW;
56+ END IF;
57+ END
58+ $$
59+ LANGUAGE plpgsql;
60+
61+ CREATE TRIGGER pathman_config_params_trigger
62+ BEFORE INSERT OR UPDATE OR DELETE ON @extschema@.pathman_config_params
63+ FOR EACH ROW EXECUTE PROCEDURE @extschema@.pathman_config_params_trigger_func();
64+
65+ /*
66+ * Enable dump of config tables with pg_dump
67+ */
3768SELECT pg_catalog .pg_extension_config_dump (' @extschema@.pathman_config' , ' ' );
3869SELECT pg_catalog .pg_extension_config_dump (' @extschema@.pathman_config_params' , ' ' );
3970
4071
41- CREATE OR REPLACE FUNCTION @extschema@.on_enable_parent(relid OID )
42- RETURNS OID AS ' pg_pathman' LANGUAGE C STRICT;
43-
44- CREATE OR REPLACE FUNCTION @extschema@.on_disable_parent(relid OID )
45- RETURNS OID AS ' pg_pathman' LANGUAGE C STRICT;
72+ CREATE OR REPLACE FUNCTION @extschema@.invalidate_relcache(relid OID )
73+ RETURNS VOID AS ' pg_pathman' LANGUAGE C STRICT;
4674
4775/* Include parent relation into query plan's for specified relation */
4876CREATE OR REPLACE FUNCTION @extschema@.enable_parent(relation REGCLASS)
5381 ON CONFLICT (partrel) DO
5482 UPDATE SET enable_parent = True;
5583
56- PERFORM @extschema@.on_enable_parent(relation::oid );
84+ -- PERFORM @extschema@.invalidate_relcache(relation::oid);
85+ -- PERFORM @extschema@.on_enable_parent(relation::oid);
5786END
5887$$
5988LANGUAGE plpgsql;
6796 ON CONFLICT (partrel) DO
6897 UPDATE SET enable_parent = False;
6998
70- PERFORM @extschema@.on_disable_parent(relation::oid );
99+ -- PERFORM @extschema@.invalidate_relcache(relation::oid);
100+ -- PERFORM @extschema@.on_disable_parent(relation::oid);
71101END
72102$$
73103LANGUAGE plpgsql;
@@ -143,12 +173,12 @@ CREATE TYPE @extschema@.PathmanRange (
143173/*
144174 * Copy rows to partitions
145175 */
146- CREATE OR REPLACE FUNCTION @extschema@.partition_data (
147- p_relation regclass
148- , p_min ANYELEMENT DEFAULT NULL ::text
149- , p_max ANYELEMENT DEFAULT NULL ::text
150- , p_limit INT DEFAULT NULL
151- , OUT p_total BIGINT )
176+ CREATE OR REPLACE FUNCTION @extschema@._partition_data_concurrent (
177+ p_relation regclass,
178+ p_min ANYELEMENT DEFAULT NULL ::text ,
179+ p_max ANYELEMENT DEFAULT NULL ::text ,
180+ p_limit INT DEFAULT NULL ,
181+ OUT p_total BIGINT )
152182AS
153183$$
154184DECLARE
@@ -201,33 +231,30 @@ END
201231$$
202232LANGUAGE plpgsql;
203233
204- /*
205- * Copy rows to partitions
206- */
207- -- CREATE OR REPLACE FUNCTION @extschema@.partition_data(
208- -- parent_relid REGCLASS,
209- -- OUT p_total BIGINT)
210- -- AS
211- -- $$
212- -- DECLARE
213- -- relname TEXT;
214- -- rec RECORD;
215- -- cnt BIGINT := 0;
216-
217- -- BEGIN
218- -- p_total := 0;
219-
220- -- /* Create partitions and copy rest of the data */
221- -- EXECUTE format('WITH part_data AS (DELETE FROM ONLY %1$s RETURNING *)
222- -- INSERT INTO %1$s SELECT * FROM part_data',
223- -- @extschema@.get_schema_qualified_name(parent_relid));
224-
225- -- /* Get number of inserted rows */
226- -- GET DIAGNOSTICS p_total = ROW_COUNT;
227- -- RETURN;
228- -- END
229- -- $$
230- -- LANGUAGE plpgsql;
234+ CREATE OR REPLACE FUNCTION @extschema@.partition_data(
235+ parent_relid REGCLASS,
236+ OUT p_total BIGINT )
237+ AS
238+ $$
239+ DECLARE
240+ relname TEXT ;
241+ rec RECORD;
242+ cnt BIGINT := 0 ;
243+
244+ BEGIN
245+ p_total := 0 ;
246+
247+ /* Create partitions and copy rest of the data */
248+ EXECUTE format(' WITH part_data AS (DELETE FROM ONLY %1$s RETURNING *)
249+ INSERT INTO %1$s SELECT * FROM part_data' ,
250+ @extschema@.get_schema_qualified_name(parent_relid));
251+
252+ /* Get number of inserted rows */
253+ GET DIAGNOSTICS p_total = ROW_COUNT;
254+ RETURN;
255+ END
256+ $$
257+ LANGUAGE plpgsql;
231258
232259/*
233260 * Disable pathman partitioning for specified relation
388415DECLARE
389416 obj record;
390417 pg_class_oid oid ;
391-
392418BEGIN
393419 pg_class_oid = ' pg_catalog.pg_class' ::regclass;
394420
395421 /* Handle 'DROP TABLE' events */
396422 WITH to_be_deleted AS (
397- SELECT cfg .partrel AS rel
398- FROM pg_event_trigger_dropped_objects() AS events
399- JOIN @extschema@.pathman_config AS cfg
400- ON cfg .partrel ::oid = events .objid
423+ SELECT cfg .partrel AS rel FROM pg_event_trigger_dropped_objects() AS events
424+ JOIN @extschema@.pathman_config AS cfg ON cfg .partrel ::oid = events .objid
401425 WHERE events .classid = pg_class_oid
402426 )
403427 DELETE FROM @extschema@.pathman_config
404428 WHERE partrel IN (SELECT rel FROM to_be_deleted);
429+
430+ /* Cleanup params table too */
431+ WITH to_be_deleted AS (
432+ SELECT cfg .partrel AS rel FROM pg_event_trigger_dropped_objects() AS events
433+ JOIN @extschema@.pathman_config_params AS cfg ON cfg .partrel ::oid = events .objid
434+ WHERE events .classid = pg_class_oid
435+ )
436+ DELETE FROM @extschema@.pathman_config_params
437+ WHERE partrel IN (SELECT rel FROM to_be_deleted);
405438END
406439$$
407440LANGUAGE plpgsql;
@@ -448,6 +481,8 @@ BEGIN
448481 RETURNING * )
449482 SELECT count (* ) from config_num_deleted INTO conf_num_del;
450483
484+ DELETE FROM @extschema@.pathman_config_params WHERE partrel = parent_relid;
485+
451486 IF conf_num_del = 0 THEN
452487 RAISE EXCEPTION ' table % has no partitions' , parent_relid::text ;
453488 END IF;
0 commit comments