\set VERBOSITY terse CREATE EXTENSION pg_pathman; CREATE SCHEMA callbacks; /* Check callbacks */ CREATE OR REPLACE FUNCTION callbacks.abc_on_part_created_callback(args JSONB) RETURNS VOID AS $$ BEGIN RAISE WARNING 'callback arg: %', args::TEXT; END $$ language plpgsql; /* callback is in public namespace, must be schema-qualified */ CREATE OR REPLACE FUNCTION public.dummy_cb(args JSONB) RETURNS VOID AS $$ BEGIN END $$ language plpgsql; CREATE TABLE callbacks.abc(a serial, b int); SELECT create_range_partitions('callbacks.abc', 'a', 1, 100, 2); NOTICE: sequence "abc_seq" does not exist, skipping create_range_partitions ------------------------- 2 (1 row) SELECT set_init_callback('callbacks.abc', 'public.dummy_cb(jsonb)'); set_init_callback ------------------- (1 row) /* check that callback is schema-qualified */ SELECT init_callback FROM pathman_config_params WHERE partrel = 'callbacks.abc'::REGCLASS; init_callback ------------------------ public.dummy_cb(jsonb) (1 row) /* reset callback */ SELECT set_init_callback('callbacks.abc'); set_init_callback ------------------- (1 row) /* should return NULL */ SELECT init_callback FROM pathman_config_params WHERE partrel = 'callbacks.abc'::REGCLASS; init_callback --------------- (1 row) SELECT set_init_callback('callbacks.abc', 'callbacks.abc_on_part_created_callback(jsonb)'); set_init_callback ------------------- (1 row) /* check that callback is schema-qualified */ SELECT init_callback FROM pathman_config_params WHERE partrel = 'callbacks.abc'::REGCLASS; init_callback ----------------------------------------------- callbacks.abc_on_part_created_callback(jsonb) (1 row) DROP TABLE callbacks.abc CASCADE; NOTICE: drop cascades to 2 other objects /* set callback to be called on RANGE partitions */ CREATE TABLE callbacks.abc(a serial, b int); SELECT create_range_partitions('callbacks.abc', 'a', 1, 100, 2); create_range_partitions ------------------------- 2 (1 row) SELECT set_init_callback('callbacks.abc', 'callbacks.abc_on_part_created_callback(jsonb)'); set_init_callback ------------------- (1 row) INSERT INTO callbacks.abc VALUES (123, 1); INSERT INTO callbacks.abc VALUES (223, 1); /* show warning */ WARNING: callback arg: {"parent": "abc", "parttype": "2", "partition": "abc_3", "range_max": "301", "range_min": "201", "parent_schema": "callbacks", "partition_schema": "callbacks"} SELECT set_spawn_using_bgw('callbacks.abc', true); set_spawn_using_bgw --------------------- (1 row) SELECT get_number_of_partitions('callbacks.abc'); get_number_of_partitions -------------------------- 3 (1 row) INSERT INTO callbacks.abc VALUES (323, 1); SELECT get_number_of_partitions('callbacks.abc'); /* +1 partition (created by BGW) */ get_number_of_partitions -------------------------- 4 (1 row) SELECT set_spawn_using_bgw('callbacks.abc', false); set_spawn_using_bgw --------------------- (1 row) SELECT append_range_partition('callbacks.abc'); WARNING: callback arg: {"parent": "abc", "parttype": "2", "partition": "abc_5", "range_max": "501", "range_min": "401", "parent_schema": "callbacks", "partition_schema": "callbacks"} append_range_partition ------------------------ callbacks.abc_5 (1 row) SELECT prepend_range_partition('callbacks.abc'); WARNING: callback arg: {"parent": "abc", "parttype": "2", "partition": "abc_6", "range_max": "1", "range_min": "-99", "parent_schema": "callbacks", "partition_schema": "callbacks"} prepend_range_partition ------------------------- callbacks.abc_6 (1 row) SELECT add_range_partition('callbacks.abc', 501, 602); WARNING: callback arg: {"parent": "abc", "parttype": "2", "partition": "abc_7", "range_max": "602", "range_min": "501", "parent_schema": "callbacks", "partition_schema": "callbacks"} add_range_partition --------------------- callbacks.abc_7 (1 row) SELECT drop_partitions('callbacks.abc'); NOTICE: function callbacks.abc_upd_trig_func() does not exist, skipping NOTICE: 0 rows copied from callbacks.abc_1 NOTICE: 1 rows copied from callbacks.abc_2 NOTICE: 1 rows copied from callbacks.abc_3 NOTICE: 1 rows copied from callbacks.abc_4 NOTICE: 0 rows copied from callbacks.abc_5 NOTICE: 0 rows copied from callbacks.abc_6 NOTICE: 0 rows copied from callbacks.abc_7 drop_partitions ----------------- 7 (1 row) /* set callback to be called on HASH partitions */ SELECT set_init_callback('callbacks.abc', 'callbacks.abc_on_part_created_callback(jsonb)'); set_init_callback ------------------- (1 row) SELECT create_hash_partitions('callbacks.abc', 'a', 5); WARNING: callback arg: {"parent": "abc", "parttype": "1", "partition": "abc_0", "parent_schema": "callbacks", "partition_schema": "callbacks"} WARNING: callback arg: {"parent": "abc", "parttype": "1", "partition": "abc_1", "parent_schema": "callbacks", "partition_schema": "callbacks"} WARNING: callback arg: {"parent": "abc", "parttype": "1", "partition": "abc_2", "parent_schema": "callbacks", "partition_schema": "callbacks"} WARNING: callback arg: {"parent": "abc", "parttype": "1", "partition": "abc_3", "parent_schema": "callbacks", "partition_schema": "callbacks"} WARNING: callback arg: {"parent": "abc", "parttype": "1", "partition": "abc_4", "parent_schema": "callbacks", "partition_schema": "callbacks"} create_hash_partitions ------------------------ 5 (1 row) DROP TABLE callbacks.abc CASCADE; NOTICE: drop cascades to 5 other objects /* test the temprary deletion of callback function */ CREATE TABLE callbacks.abc(a serial, b int); SELECT set_init_callback('callbacks.abc', 'callbacks.abc_on_part_created_callback(jsonb)'); set_init_callback ------------------- (1 row) SELECT create_range_partitions('callbacks.abc', 'a', 1, 100, 2); WARNING: callback arg: {"parent": "abc", "parttype": "2", "partition": "abc_1", "range_max": "101", "range_min": "1", "parent_schema": "callbacks", "partition_schema": "callbacks"} WARNING: callback arg: {"parent": "abc", "parttype": "2", "partition": "abc_2", "range_max": "201", "range_min": "101", "parent_schema": "callbacks", "partition_schema": "callbacks"} create_range_partitions ------------------------- 2 (1 row) INSERT INTO callbacks.abc VALUES (201, 0); /* +1 new partition */ WARNING: callback arg: {"parent": "abc", "parttype": "2", "partition": "abc_3", "range_max": "301", "range_min": "201", "parent_schema": "callbacks", "partition_schema": "callbacks"} DROP FUNCTION callbacks.abc_on_part_created_callback(jsonb); INSERT INTO callbacks.abc VALUES (301, 0); /* +0 new partitions (ERROR) */ ERROR: callback function "callbacks.abc_on_part_created_callback(jsonb)" does not exist CREATE OR REPLACE FUNCTION callbacks.abc_on_part_created_callback(args JSONB) RETURNS VOID AS $$ BEGIN RAISE WARNING 'callback arg: %', args::TEXT; END $$ language plpgsql; INSERT INTO callbacks.abc VALUES (301, 0); /* +1 new partition */ WARNING: callback arg: {"parent": "abc", "parttype": "2", "partition": "abc_5", "range_max": "401", "range_min": "301", "parent_schema": "callbacks", "partition_schema": "callbacks"} DROP TABLE callbacks.abc CASCADE; NOTICE: drop cascades to 4 other objects DROP SCHEMA callbacks CASCADE; NOTICE: drop cascades to 2 other objects DROP EXTENSION pg_pathman CASCADE;